前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >根密钥保护的困境与思考

根密钥保护的困境与思考

原创
作者头像
bowenerchen
发布2024-05-18 14:07:54
2831
发布2024-05-18 14:07:54
举报
文章被收录于专栏:梵高先生梵高先生

引言

根密钥保护,是一个重要且复杂的议题,因为根密钥是整个加密体系中最核心的部分。

这里所说的根密钥,其背后往往涉及的是一个密钥保护链,这个密钥保护链最终服务的就是业务系统中的敏感数据。

密钥的多级链式保护
密钥的多级链式保护

密钥与数据

隐藏明文数据

加密数据

对于意识到敏感数据不能直接明文暴露的开发者或产品团队来说,往往会直接选择对称加密算法来对数据做加密,以达到隐藏明文数据的效果。

这里最常见的对称加密算法包括 AES-CBC、AES-GCM、SM4 等,这些算法同时兼顾了运算性能和安全性,对业务的运行带来的影响可以降到最低

比如使用易加密工具进行 AES-CBC 模式加密数据:

代码语言:python
复制
# 安装工具
❯ pip install easy-encryption-tool

# 使用工具
❯ easy_encryption_tool aes -m cbc -a encrypt -i "张三 13211092209 421097199809232342"

------ df05f9767a73cfe7 begin@2024-05-18_10:21:07.701 ------
plain size:37
key:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
iv:vvvvvvvvvvvvvvvv
cipher size:48
cipher:+m+O07MYtdafbFXtpIJYc0B5K1SXMbC/z+4yTUeNG1C9dTMJfcwVZnNSQbUPRKz7
auth_tag_size:0
auth_tag:
------ df05f9767a73cfe7 took 1.841 milli-seconds to execute ------

上述代码片段中,模拟对敏感数据 张三 13211092209 421097199809232342 (假设这里的数据代表的含义是:用户名、电话号码、身份证)进行了加密;

最终得到了密文:

+m+O07MYtdafbFXtpIJYc0B5K1SXMbC/z+4yTUeNG1C9dTMJfcwVZnNSQbUPRKz7

对数据加密使用的密钥是:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

对数据加密使用的 IV 是:vvvvvvvvvvvvvvvv

解密数据

当然,使用同样的密钥和 IV,可以将密文还原为明文。

代码语言:python
复制
❯ easy_encryption_tool aes -m cbc -a decrypt -i "+m+O07MYtdafbFXtpIJYc0B5K1SXMbC/z+4yTUeNG1C9dTMJfcwVZnNSQbUPRKz7" -e -k "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" -v "vvvvvvvvvvvvvvvv"

------ cd5710a1a54718e1 begin@2024-05-18_10:29:04.131 ------
cipher size:48
plain size:37
str plain:张三 13211092209 421097199809232342
------ cd5710a1a54718e1 took 1.824 milli-seconds to execute ------

但是如果使用错误的密钥或者 IV,那么将无法得到明文数据或得到错误的明文数据:

代码语言:python
复制
❯ easy_encryption_tool aes -m cbc -a decrypt -i "+m+O07MYtdafbFXtpIJYc0B5K1SXMbC/z+4yTUeNG1C9dTMJfcwVZnNSQbUPRKz7" -e -k "xxxxxxxxxxxxxxxxxxxxxxxxxxxx" -v "vvvvvvvvvvvvvvvv"

------ 03b05e83d7782242 begin@2024-05-18_10:31:31.223 ------
decrypt +m+O07MYtdafbFXtpIJYc0B5K1SXMbC/z+4yTUeNG1C9dTMJfcwVZnNSQbUPRKz7 failed:Invalid padding bytes.
------ 03b05e83d7782242 took 1.921 milli-seconds to execute ------

更多关于如何正确使用 AES 对称加密算法的内容,可以参考我以前的文章:

《30分钟搞定AES系列(上):基础特性》

《30分钟搞定AES系列(中):PaddingOracle填充攻击分析与启示》

《30分钟搞定AES系列(下):IV与加密语义安全性探究》

保留数据特征以方便查找或比对

使用哈希算法

对于一些业务系统来说,在成功的隐藏数据之后,也需要能够依据某些数据特征,对数据进行比对。

比如对于明文数据:张三 13211092209 421097199809232342,再通过对称加密将其变为密文数据后,在一些关键的查找逻辑上,我需要知道此时的明文数据究竟是不是可以匹配上,但是明文又不能直接暴露或存储,因此此时会有业务系统考虑使用 hash 算法对明文做特征提取,比如使用 sha256:

代码语言:shell
复制
❯ echo "张三 13211092209 421097199809232342" > test_data.bin
❯ cat test_data.bin
张三 13211092209 421097199809232342
❯ sha256sum test_data.bin
278dfdadc035c68bc6709c2efd0eb63035dfbf15a5e5c852020e63d78bf95a4f  test_data.bin

使用高强的哈希算法是一种不错的选择,但是对于某些固定的数据,如手机号码、身份证号号码等,由于 hash 算法本身的一些特性,对于已经掌握了部分敏感数据的人来说,还是容易对数据做出碰撞,比如假设某些黑客已经有了大量的明文手机号码库或身份证号码库,那么对这些数据算出其固定的 hash 值是很简单的,使用这些计算出来的值再去对业务系统的数据做碰撞比对,难度会降低很多。

使用HMAC

使用 HMAC 可能是比哈希算法更安全的做法。

代码语言:shell
复制
❯ easy_encryption_tool hmac -i "张三 13211092209 421097199809232342" -k "my_hmac_key_for_data"

------ 84bcb95eb9a698a8 begin@2024-05-18_10:46:58.079 ------
data size:37Bytes
key:my_hmac_key_for_data
hmac:af66a2dd2fcc5d89b1d6ea019a169222bcf098ab177da672d4b8115054b7543e
------ 84bcb95eb9a698a8 took 0.028 milli-seconds to execute ------

使用 HMAC 时,可以引入 HMAC 的密钥:my_hmac_key_for_data,以此增加复杂度,降低数据被碰撞的概率。

当然这里讲的碰撞并不是指在算法层面做碰撞,而是如前面所提到的,是指在掌握了一部分明文数据后,基于明文数据直接算出其 HASH 值,然后使用 HASH 值做比对的碰撞。


更多关于哈希算法和 HMAC 算法使用的内容可以参考我以前的文章:

《MD5哈希碰撞之哈希长度拓展攻击》

《消息验证码MAC入门指南》

密钥的安全性成为了关键

从上面的代码示例其实不难得出,对数据的保护,其实就是对密钥的保护。

无论是对称加密的密钥:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk 还是数据 HMAC 密钥:my_hmac_key_for_data,二者的泄露,尤其是对称密钥的泄露,将会对数据的安全性造成极大的隐患。

密钥的链式保护

密钥本身也是一种数据,因此,数据的保护依赖于数据密钥,而数据密钥的保护,又依赖于保护数据密钥的密钥,这里我们统一称其为根密钥。

基于根密钥的密钥保护链,构成了数据保护的一种范式。

密钥链式保护示例
密钥链式保护示例

根密钥的重要性

根密钥是整个链式保护体系的信任基础,根密钥的泄露将会导致整个信息体系的崩塌。

  • 信任的起点:根密钥是构建信任的起点,所有的加密操作和数据保护措施都建立在根密钥的安全性之上
  • 数据保护的核心:根密钥是数据保护的核心,它直接影响到数据的机密性、完整性和可用性。
  • 安全策略的支撑:根密钥支撑着整个组织的安全策略,包括访问控制、数据加密、身份验证等。
  • 合规性的基础:根密钥的安全管理是满足法律、法规和合规性要求的基础。
  • 灾难恢复的关键:在灾难恢复计划中,根密钥的安全性和可恢复性是重建加密体系的关键。
  • 风险管理的重点:根密钥是风险管理的重点,需要通过各种安全措施来降低其风险。
  • 业务连续性的保障:根密钥的安全性直接关系到业务连续性,一旦根密钥受到威胁,可能会对业务运营产生严重影响。

静态的根密钥带来的问题

常见的密钥保护体系有以下几种:

一把数据密钥保护所有数据
一把数据密钥保护所有数据
数据密钥池化
数据密钥池化

从图中不能发现,静态的根密钥具有单点风险,大致可以描述为:

  • 固定的攻击目标:静态的根密钥为攻击者提供了一个固定的攻击目标。如果攻击者能够破解或获取这把密钥,他们就能够访问所有使用该根密钥派生出的密钥所保护的数据。
  • 长期风险:随着时间的推移,密钥的安全性可能会因为技术进步(如量子计算的发展)或安全漏洞的发现而降低。固化的根密钥无法适应这些变化,增加了长期安全风险。
  • 密钥泄露:如果根密钥在任何时候被泄露,由于它是静态的,攻击者可以持续利用这个密钥来解密数据,即使数据是在密钥泄露之前加密的。
  • 缺乏灵活性:静态根密钥限制了密钥管理策略的灵活性。例如,在需要快速响应安全事件或政策变更时,固化的根密钥可能无法及时更新或替换。
  • 技术演进的挑战:随着加密技术的发展,可能需要更安全或不同类型的根密钥来适应新的加密算法或标准。静态根密钥无法灵活适应这些技术演进。
  • 合规性问题:某些法规或标准可能要求定期更换密钥以保持数据的安全性。静态根密钥可能无法满足这些合规性要求。
  • 单点依赖性问题:系统和应用程序可能过度依赖单一的根密钥,这增加了因根密钥问题导致的系统性风险。

根密钥的动态化

根密钥的动态化是链式密钥保护体系中比较好的一种落地方式。

有助于提高整个加密体系的安全性和灵活性。

根密钥的池化

池化的根密钥
池化的根密钥

池化的根密钥,可以有以下好处:

  • 分散风险:通过使用根密钥池,风险不再集中在单一的密钥上。即使某个密钥受到威胁,也不会导致整个系统的安全受到破坏。
  • 提高可用性:在某些密钥不可用或需要维护时,根密钥池可以提供备用密钥,保证服务的连续性和可用性。
  • 适应性强:根密钥池可以根据安全需求的变化快速调整,比如增加密钥数量或更新密钥算法。
  • 合规性支持:某些法规或标准可能要求对密钥进行更严格的管理,根密钥池可以更好地满足这些要求。
  • 负载均衡:在密钥使用频率较高的情况下,根密钥池可以分散密钥生成和加密解密的工作负载,提高系统的整体性能。

根密钥的定期轮换

根密钥自动定期轮换
根密钥自动定期轮换

自动轮转的根密钥可以带来以下显而易见的好处:

  • 降低泄露风险:自动轮转减少了密钥被泄露后所带来的长期风险,因为密钥的有效时间被限制在一定范围内。
  • 提高安全性:定期更换密钥可以确保加密强度与最新的安全标准保持一致,有助于防止老旧或已被破解的算法被继续使用。
  • 减少攻击窗口:即使攻击者发现了某种破解方法,由于密钥会定期更换,这种方法的有效性也会受到限制。
  • 简化密钥管理人为干预:自动化的轮转流程简化了密钥管理,减少了人为错误和操作复杂性。
  • 提高安全响应速度:在安全事件发生时,自动轮转可以迅速切断旧密钥的使用,减少潜在损失。
  • 提升安全弹性:在密钥被泄露的情况下,自动轮转可以快速恢复系统的安全性,减少对业务的影响。
  • 适应技术演进:随着加密技术的不断演进,自动轮转机制可以确保根密钥及时更新,以适应新的加密技术。

根密钥访问管理

访问密钥管理系统
访问密钥管理系统

人的身份认证问题

物理访问控制

对于物理密码设备的访问,严格遵守多因素访问控制流程是一种推荐的做法。

理论上,我们可以从以下几方面来验证人的身份:

  • 知识因素:用户必须需要输入密码或口令,这是他们所知道的信息。
  • 拥有因素:用户必须插入一个物理令牌或智能卡,这是他们所拥有的身份标识。
  • 生物因素:在允许的情况下,用户有必要进行生物识别,如指纹扫描或面部识别。

远程访问控制

对于基于网络远程访问的路径,其多因素认证流程大致如下:

  • 密码或口令:户必须需要输入密码或口令,这是他们所知道的信息。
  • 一次性密码(OTP):系统发送一个一次性密码到用户的手机或邮箱上,用户需要输入这个OTP。
  • 二次验证:如果可能的话,还需要要求用户回答一个安全问题或进行其他形式的身份验证。

程序的身份认证问题

程序的身份认证始终都是一个难题,尤其在涉及到程序访问根密钥时,很容易陷入无限依赖的情况。

比如通过为程序颁发数字证书,只有数字证书校验通过才允许程序访问根密钥,但是如果数字证书被泄露或被中间人窃听,那么最后还是会陷入到对身份根证书的无限依赖中。

程序的身份认证最终的问题是要解决好在安全性、可用性、性能和成本之间平衡的问题。

如果对于程序的身份验证也引入类似于多因素认证的逻辑步骤,难么对于常规的分布式、多集群的业务,将会带来巨量的运维和维护成本,并且会对业务系统自身的可扩展性带来巨大的伤害。

当然,除开技术手段的原因外,内部人员带来的威胁也是一个巨大的隐患。内部人员很可能由于疏忽或恶意行为,绕过身份认证机制,导致安全策略失效。

对于运维场景下的低频运行的程序,可以适当引入多因素的身份认证,以解决身份泄露导致的根密钥泄露问题。而对于常规的分布式、集群化的业务程序,则更需要配合事前、事中、事后的监测手段,来收敛爆炸面积,降低风险带来的损伤。

程序身份认证问题的综合保护范式
程序身份认证问题的综合保护范式

职业道德与安全意识的培养

无法通过技术手段闭环的安全问题,最终几乎都是人的问题。

职业道德的培养有助于建立一个信任的环境,员工会主动保护根密钥和身份认证信息,避免内部威胁的发生。

职业道德还涉及到对员工进行道德和法律后果的教育,使他们意识到违反安全规定可能带来的严重后果。

安全意识的提高有助于员工在日常工作中采取正确的行为,比如警惕钓鱼邮件、使用强密码、及时报告可疑行为等。

安全意识还体现在编码和运维场景中,比如:

  • 遵循安全编码的最佳实践,如输入验证、错误处理、数据加密、安全配置等,以减少安全漏洞
  • 定期进行代码审查,以发现和修复潜在的安全问题。这可以通过自动化工具或人工审查来实现
  • 谨慎管理第三方库和依赖,确保它们是安全的,并且及时更新以修复已知的安全漏洞
  • 在开发过程中集成安全测试,包括静态代码分析动态代码分析和渗透测试,以识别和修复安全缺陷
  • 在设计系统时,确保应用程序和服务运行在最低必要的权限下,以减少潜在的安全风险
  • 及时应用安全补丁和更新,以保护系统免受已知漏洞的攻击
  • 制定和实施数据备份和灾难恢复计划,确保在安全事件发生时能够快速恢复服务
  • 使用配置管理工具来跟踪和控制系统配置,防止配置被拷贝造成数据泄露

总的来说,职业道德和安全意识培养是根密钥保护和身份认证保护的基石,它们是主动安全防护中的关键一环。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 密钥与数据
    • 隐藏明文数据
      • 加密数据
      • 解密数据
    • 保留数据特征以方便查找或比对
      • 使用哈希算法
      • 使用HMAC
  • 密钥的安全性成为了关键
    • 密钥的链式保护
      • 根密钥的重要性
        • 静态的根密钥带来的问题
        • 根密钥的动态化
          • 根密钥的池化
            • 根密钥的定期轮换
            • 根密钥访问管理
              • 人的身份认证问题
                • 物理访问控制
                • 远程访问控制
              • 程序的身份认证问题
                • 职业道德与安全意识的培养
                相关产品与服务
                数据安全审计
                腾讯云数据安全审计(Data Security Audit,DSAudit)是一款基于人工智能的数据库安全审计系统,可挖掘数据库运行过程中各类潜在风险和隐患,为数据库安全运行保驾护航,是企业的等保合规利器。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档