项目1:实现安全密钥管理
本项目将指导您如何在Trusty环境中实现安全密钥管理,包括基于HMAC的密钥保护机制和密钥使用次数限制策略。这些技术是构建可信执行环境(TEE)安全应用的基础。
HMAC (Hash-based Message Authentication Code) 是一种基于哈希函数的消息认证码算法,用于验证消息的完整性和真实性。
为什么选择HMAC? HMAC提供了强大的安全保证,能够抵抗长度扩展攻击,并且计算效率高,非常适合在TEE环境中使用。
以下是实现HMAC密钥保护的关键步骤:
// 生成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(¶m_set, key, key_size, key_id);
}
// 计算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, ¶m_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, ¶m_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中完成。
图1: Trusty环境中的HMAC密钥保护架构
架构关键组件:
限制密钥使用次数是纵深防御策略的重要组成部分,可以:
在存储密钥时,添加使用次数限制的元数据:
typedef struct {
uint64_t key_id; // 密钥标识符
uint32_t max_uses; // 最大使用次数
uint32_t current_uses; // 当前已使用次数
uint8_t key_data[]; // 实际密钥数据
} limited_use_key_t;
在每次使用密钥前检查并更新计数器:
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;
}
当密钥达到使用限制时自动销毁:
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(一次性密钥),并在每次使用后立即销毁密钥。