0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

存储密钥与文件加密密钥介绍

麦辣鸡腿堡 来源:TrustZone 作者:Hcoco 2023-11-21 11:43 次阅读

可信应用的存储密钥

可信应用的存储密钥(Trusted Applicant Storage Key, TSK)是生成FEK时使用到的密钥。

TSK是使用SSK作为密钥对TA的UUID经HMAC计算获得,类似于HMAC(SSK, UUID)的方式生成TSK。

在调用tee_fs_fek_crypt函数时会计算TSK的值。TSK最终会被用来生成FEK, FEK会在使用安全存储功能保存数据时被用来加密数据。

图片

文件加密密钥

文件加密密钥(File Encryption Key, FEK)是安全存储功能用于对数据进行加密时使用的AES密钥,该密钥在生成文件时会 使用PRNG算法随机产生 ,产生的 FEK会使用TSK进行加密 ,然后保存到head.enc_fek变量中。

(PRNGPRNG(pseudorandom number generator)伪随机数生成器是指通过特定算法生成一系列的数字,使得这一系列的数字看起来是随机的,但是实际是确定的,所以叫伪随机数。)

TA在每次使用 安全存储功能创建一个安全文件时就会生成一个随机数作为FEK ,即每个TA 中的每个安全文件都有一个FEK用于加密对应文件中的数据 。(安全加倍啊)

关于FEK的产生可简单理解为如下公式,使用的初始化向量IV值为0:

AES_CBC(in_key, TSK)

OP-TEE通过调用tee_fs_fek_crypt函数来生成一个FEK,该函数代码如下:

TEE_Result tee_fs_fek_crypt(const TEE_UUID *uuid, TEE_OperationMode mode,
                      const uint8_t *in_key, size_t size,
                      uint8_t *out_key)
        {
            TEE_Result res;
            uint8_t *ctx = NULL;
            size_t ctx_size;
            uint8_t tsk[TEE_FS_KM_TSK_SIZE];
            uint8_t dst_key[size];
            /* 检查输入的用于生成FEK的随机数in_key和用于存放生成的out_key地址是否合法 */
            if (! in_key || ! out_key)
                return TEE_ERROR_BAD_PARAMETERS;
            /* 检查in_key长度 */
            if (size ! = TEE_FS_KM_FEK_SIZE)
                return TEE_ERROR_BAD_PARAMETERS;
            /* 判定SSK是否已经被初始化 */
            if (tee_fs_ssk.is_init == 0)
                return TEE_ERROR_GENERIC;
            /* 如果调用时参数uuid不为0,则调用HMAC算法生成TSK。如果UUID的值为0,则默认生成TSK
            使用的原始数据为0 */
            if (uuid) {
                res = do_hmac(tsk, sizeof(tsk), tee_fs_ssk.key,
                          TEE_FS_KM_SSK_SIZE, uuid, sizeof(*uuid));
                if (res ! = TEE_SUCCESS)
                    return res;
            } else {
                uint8_t dummy[1] = { 0 };
                res = do_hmac(tsk, sizeof(tsk), tee_fs_ssk.key,
                          TEE_FS_KM_SSK_SIZE, dummy, sizeof(dummy));
                if (res ! = TEE_SUCCESS)
                      return res;
              }
              /* 获取调用AEC_CBC操作需要的context的大小 */
              res = crypto_ops.cipher.get_ctx_size(TEE_FS_KM_ENC_FEK_ALG, &ctx_size);
              if (res ! = TEE_SUCCESS)
                  return res;
              /* 分配一份进行AES_CBC操作时需要的context空间 */
              ctx = malloc(ctx_size);
              if (! ctx)
                  return TEE_ERROR_OUT_OF_MEMORY;
              /* 使用TSK作为进行AES_CBC计算使用的key,而IV值默认为0 */
              res = crypto_ops.cipher.init(ctx, TEE_FS_KM_ENC_FEK_ALG, mode, tsk,
                              sizeof(tsk), NULL, 0, NULL, 0);
              if (res ! = TEE_SUCCESS)
                  goto exit;
              /* 将输入的in_key填充到context中,做完AES_CBC操作之后,输出的数据将会被保存到dst_
              key中 */
              res = crypto_ops.cipher.update(ctx, TEE_FS_KM_ENC_FEK_ALG,
                      mode, true, in_key, size, dst_key);
              if (res ! = TEE_SUCCESS)
                  goto exit;
              /* 执行AES_CBC的加密运算,生成FEK */
              crypto_ops.cipher.final(ctx, TEE_FS_KM_ENC_FEK_ALG);
              /* 将生成的FEK的值复制到输出参数中 */
              memcpy(out_key, dst_key, sizeof(dst_key));
          exit:
              free(ctx);
              return res;
          }
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    13

    文章

    4296

    浏览量

    85799
  • 数据库
    +关注

    关注

    7

    文章

    3794

    浏览量

    64362
  • 密钥
    +关注

    关注

    1

    文章

    138

    浏览量

    19753
收藏 人收藏

    评论

    相关推荐

    请问CYW20719是否支持“加密密钥大小控制增强”?

    CYW20719 是否支持“加密密钥大小控制增强”此 BT 5.3 功能?
    发表于 07-05 07:04

    BF70x加密密钥的产生步骤

    BF70X系列帮助文件中中提到BF70x的加密密钥的产生步骤,起初按照方法始终无法成功,现将成功版本进行一次分享步骤1:官网下载Python2.7.7版本并安装至相应的英文目录下;步骤2:将
    发表于 03-05 14:19

    请问如何才能安全地存储加密密钥

    大家好!我用的是PIC32MZ2048EFM144。我需要安全地存储加密密钥。我知道这个PIC有一个密码引擎,但是显然,它不像PIC24密码引擎,它不存储密钥。你能告诉我如何安全地
    发表于 06-13 08:24

    NAS网络存储上如何创建和使用加密文件夹?

    文件夹,输入加密密钥并选择是否启用回收站; 4.为加密文件夹设置访问权限,点击下一步; 5.确认设置后请点击创建; 备注:为了保证你的数据安全,在使用完毕后,请将
    发表于 09-24 11:00

    介绍一种芯片AES加密密钥生成工具

    芯片AES加密密钥生成工具前言:嵌入式单片机开发,为了防止别人将芯片内的代码读取出来通过反编译手段拿到源码,常用的手段是对芯片和烧录文件进行加密。大部分的芯片厂商都会提供一个加密烧录和
    发表于 02-14 06:43

    什么是秘密密钥密码技术

    什么是秘密密钥密码技术 秘密密钥加密使用一个密钥,即秘密密钥,既进行加密又进行解密消息,这也称
    发表于 03-20 15:50 2954次阅读

    密钥加密方法大全

    密钥加密方法大全 密钥加密技术用于加密和解密数据。密钥是与
    发表于 03-20 15:54 2975次阅读

    一种自主群组密钥管理方案

    针对分布式网络群组密钥更新中非更新成员参与共享密钥计算增加交互延时问题,提出一种自主密钥更新模型,通过DH协议和多项式设计一种自主群组密钥管理方案,具有单
    发表于 12-05 09:17 0次下载
    一种自主群组<b class='flag-5'>密钥</b>管理方案

    明文存储的Signal Desktop 应用程序消息解密密钥

    逆向工程研究员纳撒尼尔·苏西(Nathaniel Suchy)发现,SignalDesktop应用程序明文储存消息解密密钥,将密钥暴露于黑客攻击之下。
    的头像 发表于 10-28 09:28 3789次阅读
    明文<b class='flag-5'>存储</b>的Signal Desktop 应用程序消息解<b class='flag-5'>密密钥</b>

    赛灵思研发提供能生成独特的器件“指纹码”的密钥加密密钥

    赛灵思的最新 PUF IP 由 Verayo 提供,能生成独特的器件“指纹码”,也就是只有器件自己知道的具有强大加密功能的密钥加密密钥(KEK)。PUF 利用 CMOS 制造工艺变量优势(诸如阈值电压、氧化物厚度、金属外形、电阻
    的头像 发表于 07-30 09:22 2715次阅读

    芯片AES加密密钥生成工具

    芯片AES加密密钥生成工具前言:嵌入式单片机开发,为了防止别人将芯片内的代码读取出来通过反编译手段拿到源码,常用的手段是对芯片和烧录文件进行加密。大部分的芯片厂商都会提供一个加密烧录和
    发表于 12-09 14:36 6次下载
    芯片AES<b class='flag-5'>加密密钥</b>生成工具

    量子物理学启用下一个加密密钥

    加密的强度在很大程度上取决于加密密钥的质量。QuintessenceLabs 是一家使用量子物理学构建更强大的数据安全工具的澳大利亚网络安全公司,它开发了一个 qStream 量子随机数生成器 (QRNG),它提供具有全熵的加密密钥
    的头像 发表于 07-26 16:35 1321次阅读
    量子物理学启用下一个<b class='flag-5'>加密密钥</b>

    密钥分层管理体制

    密钥用于加密密钥交换密钥和数据密钥作本地存储
    的头像 发表于 01-24 10:05 763次阅读
    <b class='flag-5'>密钥</b>分层管理体制

    鸿蒙开发:Universal Keystore Kit 密钥管理服务 加密导入密钥 ArkTS

    加密导入ECDH密钥对为例,涉及业务侧加密密钥的[密钥生成]、[协商])等操作不在本示例中体现。
    的头像 发表于 07-08 14:22 357次阅读
    鸿蒙开发:Universal Keystore Kit <b class='flag-5'>密钥</b>管理服务 <b class='flag-5'>加密</b>导入<b class='flag-5'>密钥</b> ArkTS

    鸿蒙开发:Universal Keystore Kit密钥管理服务 加密导入密钥C、C++

    加密导入ECDH密钥对为例,涉及业务侧加密密钥的[密钥生成]、[协商]等操作不在本示例中体现。
    的头像 发表于 07-08 15:26 353次阅读
    鸿蒙开发:Universal Keystore Kit<b class='flag-5'>密钥</b>管理服务 <b class='flag-5'>加密</b>导入<b class='flag-5'>密钥</b>C、C++