引言
根密钥保护,是一个重要且复杂的议题,因为根密钥是整个加密体系中最核心的部分。
这里所说的根密钥,其背后往往涉及的是一个密钥保护链,这个密钥保护链最终服务的就是业务系统中的敏感数据。

密钥与数据
隐藏明文数据
加密数据
对于意识到敏感数据不能直接明文暴露的开发者或产品团队来说,往往会直接选择对称加密算法来对数据做加密,以达到隐藏明文数据的效果。
这里最常见的对称加密算法包括 AES-CBC、AES-GCM、SM4 等,这些算法同时兼顾了运算性能和安全性,对业务的运行带来的影响可以降到最低。
比如使用易加密工具进行 AES-CBC 模式数据加密:
| |
上述代码片段中,模拟对敏感数据 张三 13211092209 421097199809232342 (假设这里的数据代表的含义是:用户名、电话号码、身份证)进行了加密;
最终得到了密文:
+m+O07MYtdafbFXtpIJYc0B5K1SXMbC/z+4yTUeNG1C9dTMJfcwVZnNSQbUPRKz7
对数据加密使用的密钥是:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
对数据加密使用的 IV 是:vvvvvvvvvvvvvvvv
解密数据
当然,使用同样的密钥和 IV,可以将密文还原为明文。
| |
但是如果使用错误的密钥或者 IV,那么将无法得到明文数据或得到错误的明文数据:
| |
更多关于如何正确使用 AES 对称加密算法的内容,可以参考我以前的文章:
《30分钟搞定AES系列(中):PaddingOracle填充攻击分析与启示》
保留数据特征以方便查找或比对
使用哈希算法
对于一些业务系统来说,在成功的隐藏数据之后,也需要能够依据某些数据特征,对数据进行比对。
比如对于明文数据:张三 13211092209 421097199809232342,再通过对称加密将其变为密文数据后,在一些关键的查找逻辑上,我需要知道此时的明文数据究竟是不是可以匹配上,但是明文又不能直接暴露或存储,因此此时会有业务系统考虑使用 hash 算法对明文做特征提取,比如使用 sha256:
| |
使用高强的哈希算法是一种不错的选择,但是对于某些固定的数据,如手机号码、身份证号号码等,由于 hash 算法本身的一些特性,对于已经掌握了部分敏感数据的人来说,还是容易对数据做出碰撞,比如假设某些黑客已经有了大量的明文手机号码库或身份证号码库,那么对这些数据算出其固定的 hash 值是很简单的,使用这些计算出来的值再去对业务系统的数据做碰撞比对,难度会降低很多。
使用HMAC
使用 HMAC 可能是比哈希算法更安全的做法。
| |
使用 HMAC 时,可以引入 HMAC 的密钥:my_hmac_key_for_data,以此增加复杂度,降低数据被碰撞的概率。
当然这里讲的碰撞并不是指在算法层面做碰撞,而是如前面所提到的,是指在掌握了一部分明文数据后,基于明文数据直接算出其 HASH 值,然后使用 HASH 值做比对的碰撞。
更多关于哈希算法和 HMAC 算法使用的内容可以参考我以前的文章:
密钥的安全性成为了关键
从上面的代码示例其实不难得出,对数据的保护,其实就是对密钥的保护。
无论是对称加密的密钥:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk 还是数据 HMAC 密钥:my_hmac_key_for_data,二者的泄露,尤其是对称密钥的泄露,将会对数据的安全性造成极大的隐患。
密钥的链式保护
密钥本身也是一种数据,因此,数据的保护依赖于数据密钥,而数据密钥的保护,又依赖于保护数据密钥的密钥,这里我们统一称其为根密钥。
基于根密钥的密钥保护链,构成了数据保护的一种范式。

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

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

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

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

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

人的身份认证问题
物理访问控制
对于物理密码设备的访问,严格遵守多因素访问控制流程是一种推荐的做法。
理论上,我们可以从以下几方面来验证人的身份:
- 知识因素:用户必须需要输入密码或口令,这是他们所知道的信息。
- 拥有因素:用户必须插入一个物理令牌或智能卡,这是他们所拥有的身份标识。
- 生物因素:在允许的情况下,用户有必要进行生物识别,如指纹扫描或面部识别。
远程访问控制
对于基于网络远程访问的路径,其多因素认证流程大致如下:
- 密码或口令:户必须需要输入密码或口令,这是他们所知道的信息。
- 一次性密码(OTP):系统发送一个一次性密码到用户的手机或邮箱上,用户需要输入这个OTP。
- 二次验证:如果可能的话,还需要要求用户回答一个安全问题或进行其他形式的身份验证。
程序的身份认证问题
程序的身份认证始终都是一个难题,尤其在涉及到程序访问根密钥时,很容易陷入无限依赖的情况。
比如通过为程序颁发数字证书,只有数字证书校验通过才允许程序访问根密钥,但是如果数字证书被泄露或被中间人窃听,那么最后还是会陷入到对身份根证书的无限依赖中。
程序的身份认证最终的问题是要解决好在安全性、可用性、性能和成本之间平衡的问题。、
如果对于程序的身份验证也引入类似于多因素认证的逻辑步骤,难么对于常规的分布式、多集群的业务,将会带来巨量的运维和维护成本,并且会对业务系统自身的可扩展性带来巨大的伤害。
当然,除开技术手段的原因外,内部人员带来的威胁也是一个巨大的隐患。内部人员很可能由于疏忽或恶意行为,绕过身份认证机制,导致安全策略失效。
对于运维场景下的低频运行的程序,可以适当引入多因素的身份认证,以解决身份泄露导致的根密钥泄露问题。而对于常规的分布式、集群化的业务程序,则更需要配合事前、事中、事后的监测手段,来收敛爆炸面积,降低风险带来的损伤。

职业道德与安全意识的培养
无法通过技术手段闭环的安全问题,最终几乎都是人的问题。
职业道德的培养有助于建立一个信任的环境,员工会主动保护根密钥和身份认证信息,避免内部威胁的发生。
职业道德还涉及到对员工进行道德和法律后果的教育,使他们意识到违反安全规定可能带来的严重后果。
安全意识的提高有助于员工在日常工作中采取正确的行为,比如警惕钓鱼邮件、使用强密码、及时报告可疑行为等。
安全意识还体现在编码和运维场景中,比如:
- 遵循安全编码的最佳实践,如输入验证、错误处理、数据加密、安全配置等,以减少安全漏洞
- 定期进行代码审查,以发现和修复潜在的安全问题。这可以通过自动化工具或人工审查来实现
- 谨慎管理第三方库和依赖,确保它们是安全的,并且及时更新以修复已知的安全漏洞
- 在开发过程中集成安全测试,包括静态代码分析、动态代码分析和渗透测试,以识别和修复安全缺陷
- 在设计系统时,确保应用程序和服务运行在最低必要的权限下,以减少潜在的安全风险
- 及时应用安全补丁和更新,以保护系统免受已知漏洞的攻击
- 制定和实施数据备份和灾难恢复计划,确保在安全事件发生时能够快速恢复服务
- 使用配置管理工具来跟踪和控制系统配置,防止配置被拷贝造成数据泄露
总的来说,职业道德和安全意识培养是根密钥保护和身份认证保护的基石,它们是主动安全防护中的关键一环。