Trusty系统基础入门

项目2:构建安全认证TA - 指纹/PIN验证与防重放攻击设计

项目概述

本项目将指导您构建一个安全认证可信应用(TA),实现指纹/PIN验证功能,并设计有效的防重放攻击机制。通过本项目的实践,您将掌握Trusty环境下安全认证的核心实现技术。

1. 指纹/PIN验证逻辑实现

1.1 系统架构

[指纹/PIN验证系统架构图]

普通世界(Rich OS) ↔ 可信世界(Trusty) ↔ 安全硬件(如TEE、指纹传感器)

1.2 实现步骤

创建TA工程框架,定义必要的UUID和命令ID
// 示例:定义TA UUID
#define TA_FINGERPRINT_AUTH_UUID \
    { 0x12345678, 0x9abc, 0xdef0, \
      { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 } }

// 命令定义
#define TA_CMD_ENROLL     0
#define TA_CMD_VERIFY     1
#define TA_CMD_DELETE     2
实现指纹/PIN数据的安全存储
// 使用Trusty安全存储API存储指纹模板
TEE_Result store_fingerprint_template(const uint8_t *template, size_t size) {
    TEE_ObjectHandle obj;
    TEE_Attribute attr;
    uint32_t flags = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE;
    
    TEE_InitRefAttribute(&attr, TEE_ATTR_SECURE_STORAGE_ID, 
                        "fingerprint_template", strlen("fingerprint_template"));
    
    return TEE_CreatePersistentObject(TEE_STORAGE_PRIVATE, 
                                    &attr, 1, flags, 
                                    NULL, template, size, &obj);
}
实现验证逻辑核心函数
// 指纹验证函数示例
TEE_Result verify_fingerprint(const uint8_t *sample, size_t sample_size) {
    TEE_ObjectHandle obj;
    TEE_Attribute attr;
    uint8_t *stored_template;
    size_t stored_size;
    TEE_Result res;
    
    // 从安全存储中读取已注册的指纹模板
    TEE_InitRefAttribute(&attr, TEE_ATTR_SECURE_STORAGE_ID, 
                        "fingerprint_template", strlen("fingerprint_template"));
    
    res = TEE_OpenPersistentObject(TEE_STORAGE_PRIVATE, &attr, 1, 
                                  TEE_DATA_FLAG_ACCESS_READ, &obj);
    if (res != TEE_SUCCESS) return res;
    
    // 获取模板数据
    res = TEE_ReadObjectData(obj, &stored_template, &stored_size);
    if (res != TEE_SUCCESS) {
        TEE_CloseObject(obj);
        return res;
    }
    
    // 执行比对逻辑 (简化示例,实际应使用专业算法)
    if (sample_size != stored_size) {
        TEE_CloseObject(obj);
        return TEE_ERROR_SECURITY;
    }
    
    bool match = true;
    for (size_t i = 0; i < sample_size; i++) {
        if (sample[i] != stored_template[i]) {
            match = false;
            break;
        }
    }
    
    TEE_CloseObject(obj);
    return match ? TEE_SUCCESS : TEE_ERROR_SECURITY;
}
实现CA-TA通信接口
// TA命令分发处理函数
TEE_Result TA_InvokeCommandEntryPoint(void *sess_ctx, uint32_t cmd_id,
                                      uint32_t param_types, TEE_Param params[4]) {
    switch (cmd_id) {
        case TA_CMD_ENROLL:
            return handle_enroll(param_types, params);
        case TA_CMD_VERIFY:
            return handle_verify(param_types, params);
        case TA_CMD_DELETE:
            return handle_delete(param_types, params);
        default:
            return TEE_ERROR_NOT_SUPPORTED;
    }
}

1.3 安全最佳实践

2. 防重放攻击设计

2.1 重放攻击风险分析

重放攻击(Replay Attack)是指攻击者截获并重复发送有效的认证数据包,以欺骗系统。在指纹/PIN验证系统中,主要风险包括:

2.2 防御机制设计

时间戳验证

// 时间戳验证示例
#define MAX_TIME_DIFF_MS 5000 // 允许的最大时间差5秒

TEE_Result verify_timestamp(uint64_t client_timestamp) {
    uint64_t current_time = TEE_GetSystemTime();
    
    if (current_time < client_timestamp || 
        (current_time - client_timestamp) > MAX_TIME_DIFF_MS) {
        return TEE_ERROR_TIME_NOT_SET;
    }
    return TEE_SUCCESS;
}

Nonce机制

// Nonce生成与验证
TEE_Result generate_nonce(uint8_t *nonce, size_t size) {
    if (size < 16) return TEE_ERROR_BAD_PARAMETERS;
    return TEE_GenerateRandom(nonce, size);
}

TEE_Result verify_nonce(const uint8_t *expected, const uint8_t *received, size_t size) {
    if (TEE_MemCompare(expected, received, size) != 0)
        return TEE_ERROR_SECURITY;
    return TEE_SUCCESS;
}

会话令牌设计

// 安全会话令牌结构
typedef struct {
    uint32_t session_id;
    uint64_t timestamp;
    uint8_t nonce[16];
    uint8_t hmac[32]; // HMAC-SHA256
} secure_session_token_t;

// 令牌验证函数
TEE_Result verify_session_token(const secure_session_token_t *token) {
    // 1. 验证时间戳
    TEE_Result res = verify_timestamp(token->timestamp);
    if (res != TEE_SUCCESS) return res;
    
    // 2. 验证HMAC
    uint8_t computed_hmac[32];
    compute_hmac(token, sizeof(*token) - sizeof(token->hmac), computed_hmac);
    
    if (TEE_MemCompare(token->hmac, computed_hmac, sizeof(token->hmac)) != 0)
        return TEE_ERROR_SECURITY;
    
    return TEE_SUCCESS;
}

2.3 防御策略对比

防御机制 优点 局限性
时间戳 实现简单,无需存储状态 依赖时钟同步
Nonce 安全性高,不依赖时间 需要存储已用nonce
序列号 实现简单,开销小 需要持久化存储
HMAC 提供完整性和认证 计算开销较大

2.4 复合防御策略

在实际系统中,推荐采用多种防御机制的组合:

  1. 使用时间戳防止旧消息重放
  2. 结合Nonce防止时间窗口内的重放
  3. 使用HMAC确保消息完整性
  4. 实现会话过期机制
  5. 记录最近使用的认证信息

2.5 完整防重放流程示例

CA请求认证时,TA生成并返回Nonce
CA将Nonce、时间戳和认证数据一起发送给TA
TA验证时间戳有效性
TA验证Nonce是否匹配
TA执行实际认证逻辑
TA生成包含新Nonce的响应