Trusty系统基础入门

项目1:实现安全密钥管理

项目概述

本项目将指导您如何在Trusty环境中实现安全密钥管理,包括基于HMAC的密钥保护机制和密钥使用次数限制策略。这些技术是构建可信执行环境(TEE)安全应用的基础。

学习目标

  • 理解Trusty中的密钥管理机制
  • 掌握HMAC密钥保护实现方法
  • 实现密钥使用次数限制策略
  • 了解安全密钥生命周期管理

先决条件

  • 基本Trusty开发环境配置
  • 熟悉Trusty API
  • 了解密码学基础概念
  • 熟悉ARM TrustZone架构

1. 基于Trusty的HMAC密钥保护

HMAC概述

HMAC (Hash-based Message Authentication Code) 是一种基于哈希函数的消息认证码算法,用于验证消息的完整性和真实性。

为什么选择HMAC? HMAC提供了强大的安全保证,能够抵抗长度扩展攻击,并且计算效率高,非常适合在TEE环境中使用。

在Trusty中实现HMAC密钥保护

以下是实现HMAC密钥保护的关键步骤:

1. 密钥生成与存储

// 生成HMAC密钥
int generate_hmac_key(uint8_t *key, size_t key_size) {
    int rc = trusty_rng_secure_random(key, key_size);
    if (rc != 0) {
        trusty_printf("Failed to generate random key: %d\n", rc);
        return rc;
    }
    return 0;
}

// 安全存储密钥到Keymaster TA
int store_hmac_key(const uint8_t *key, size_t key_size, uint64_t *key_id) {
    keymaster_key_param_t params[] = {
        keymaster_param_enum(KM_TAG_ALGORITHM, KM_ALGORITHM_HMAC),
        keymaster_param_int(KM_TAG_KEY_SIZE, key_size * 8),
        keymaster_param_enum(KM_TAG_DIGEST, KM_DIGEST_SHA_256),
        keymaster_param_enum(KM_TAG_PURPOSE, KM_PURPOSE_SIGN),
        keymaster_param_enum(KM_TAG_PURPOSE, KM_PURPOSE_VERIFY),
    };
    
    keymaster_key_param_set_t param_set = {
        .params = params,
        .length = sizeof(params)/sizeof(keymaster_key_param_t)
    };
    
    return keymaster_import_key(&param_set, key, key_size, key_id);
}
            

2. HMAC计算与验证

// 计算HMAC
int compute_hmac(uint64_t key_id, const uint8_t *data, size_t data_len,
                 uint8_t *hmac, size_t *hmac_len) {
    keymaster_operation_handle_t op_handle;
    keymaster_key_param_t params[] = {
        keymaster_param_enum(KM_TAG_DIGEST, KM_DIGEST_SHA_256),
    };
    
    keymaster_key_param_set_t param_set = {
        .params = params,
        .length = sizeof(params)/sizeof(keymaster_key_param_t)
    };
    
    int rc = keymaster_begin(KM_PURPOSE_SIGN, key_id, &param_set, &op_handle);
    if (rc != 0) return rc;
    
    rc = keymaster_update(op_handle, NULL, data, data_len);
    if (rc != 0) return rc;
    
    rc = keymaster_finish(op_handle, NULL, NULL, hmac, hmac_len);
    return rc;
}

// 验证HMAC
int verify_hmac(uint64_t key_id, const uint8_t *data, size_t data_len,
                const uint8_t *hmac, size_t hmac_len) {
    keymaster_operation_handle_t op_handle;
    keymaster_key_param_t params[] = {
        keymaster_param_enum(KM_TAG_DIGEST, KM_DIGEST_SHA_256),
    };
    
    keymaster_key_param_set_t param_set = {
        .params = params,
        .length = sizeof(params)/sizeof(keymaster_key_param_t)
    };
    
    int rc = keymaster_begin(KM_PURPOSE_VERIFY, key_id, &param_set, &op_handle);
    if (rc != 0) return rc;
    
    rc = keymaster_update(op_handle, NULL, data, data_len);
    if (rc != 0) return rc;
    
    rc = keymaster_finish(op_handle, NULL, hmac, hmac_len, NULL);
    return rc;
}
            

安全注意事项: 永远不要在非安全世界(REE)中暴露HMAC密钥。所有密钥操作都应在Trusty TA中完成。

HMAC密钥保护架构

HMAC密钥保护架构图

图1: Trusty环境中的HMAC密钥保护架构

架构关键组件:

  1. 密钥生成服务:在安全环境中生成强随机密钥
  2. 密钥存储服务:通过Keymaster TA安全存储密钥
  3. HMAC计算服务:提供HMAC签名和验证功能
  4. 访问控制:限制对密钥的访问权限

2. 密钥使用次数限制策略

密钥使用限制的重要性

限制密钥使用次数是纵深防御策略的重要组成部分,可以:

实现密钥使用次数限制

1. 密钥元数据扩展

在存储密钥时,添加使用次数限制的元数据:

typedef struct {
    uint64_t key_id;        // 密钥标识符
    uint32_t max_uses;      // 最大使用次数
    uint32_t current_uses;  // 当前已使用次数
    uint8_t key_data[];     // 实际密钥数据
} limited_use_key_t;
            

2. 密钥使用计数器

在每次使用密钥前检查并更新计数器:

int use_key_with_limit(limited_use_key_t *key) {
    if (key->current_uses >= key->max_uses) {
        trusty_printf("Key usage limit reached (%u/%u)\n", 
                     key->current_uses, key->max_uses);
        return KM_ERROR_KEY_USAGE_LIMIT_EXCEEDED;
    }
    
    // 原子操作增加计数器
    uint32_t prev_uses = trusty_atomic_fetch_add(&key->current_uses, 1);
    if (prev_uses >= key->max_uses) {
        // 回滚计数器增加
        trusty_atomic_fetch_sub(&key->current_uses, 1);
        return KM_ERROR_KEY_USAGE_LIMIT_EXCEEDED;
    }
    
    return 0;
}
            

3. 密钥自动销毁

当密钥达到使用限制时自动销毁:

void check_and_destroy_key(limited_use_key_t *key) {
    if (key->current_uses >= key->max_uses) {
        trusty_printf("Destroying key %llu (usage limit reached)\n", key->key_id);
        secure_memset(key->key_data, 0, key->key_size);
        keymaster_delete_key(key->key_id);
    }
}
            

高级使用限制策略

时间窗口限制

限制密钥在特定时间窗口内的使用次数,例如每小时最多使用100次。

组合限制策略

结合使用次数和调用者身份进行限制,不同调用者有不同配额。

动态调整限制

根据系统安全状态动态调整密钥使用限制。

最佳实践: 对于高安全要求的场景,建议将使用次数限制设置为1(一次性密钥),并在每次使用后立即销毁密钥。

项目总结

关键知识点回顾

进一步学习