2020年1月1日《中国国家密码法》正式颁布实施,密码工作的科学化、规范化要求越来越迫切。现代密码技术由密码算法和密钥两部分组成,根据kerchkhoff准则,一个密码系统的安全性不是建立在它的算法是保密的,而是建立在它所选择的密钥是保密的。如果密钥泄露,那么所有加密数据的机密性都将无法得到保证。因此,保护密钥安全就是保护数据安全。
密钥安全现状分析
目前人们对密钥的脆弱性缺少足够的认识,密钥保护的安全意识存在不足,各组织机构缺少整体密钥安全策略,由此导致密钥在使用过程中产生如下风险:
1、密钥硬编码方法存在通过源码泄露密钥风险
密钥硬编码是指在代码编写过程中将密钥初始值作为程序变量写入源代码的行为。将硬编码加密密钥的源代码编译成的二进制软件包,发布到公开渠道,那么攻击者不需要高超的攻击技巧,便可从公开渠道获取软件包,进而使用逆向工程技术,即可分析出源代码并提取硬编码加密密钥。
2、所有秘密共用一个密钥导致访问控制可被绕过
根据安全最小化原则,主体访问的客体数据范围应该是满足主体工作需要所必需的,例如财务报告只能由财务部门员工查看,员工背景信息只能由HR部门员工查看,不允许两部门员工交叉访问对方信息。如果所有秘密共用一个密钥,相当于一把钥匙可以打开所有的锁,恶意攻击者一旦获取了密钥,就可以利用它解密其他工作秘密访问非授权信息,导致访问控制措施被绕过。
3、密钥明文存储在运行环境易被攻击者窃取
鉴于密钥硬编码存在的安全问题,将密钥从源码库中分离出来,保存到配置文件或数据库中,是很多组织机构采用的安全规避措施。然而,这样的做法仍然不能保证密钥安全,因为针对配置文件或数据库的访问受限于操作系统或数据库系统提供的权限访问控制机制,这意味着无论如何隐藏配置文件或数据库数据,只要恶意攻击者利用系统漏洞提权成功,就能直接获取密钥。
4、密钥缺少变更机制增加密钥泄露可能性
大部分组织机构在产品的生命周期内和多个版本的迭代过程中都使用同一个密钥对数据加密和解密。如果密钥长期保持不变,攻击者就可以利用充足的时间寻找系统漏洞或者执行社会工程学攻击。一方面,密钥留存的时间越长密钥被泄露的可能性就越大;另一方面,密钥的长期使用也给被保护的数据带来泄露风险,攻击者可以利用已获得的密钥对数据机密性造成持续威胁。
5、密钥强度不足易被暴力破解
除了加密算法本身以外,密钥强度是另一个影响加密算法强度的决定因素,密钥强度越强,密文被暴力破解的可能性越低。密钥的生成过程中,密钥长度是影响密钥强度的因素之一,有些加密算法已经因为密钥长度不足而被破解,例如56位DES算法和1024位的RSA算法,使用这类算法和密钥,数据机密性得不到保障。密钥的随机性是影响密钥强度的另外一个因素,使用手工输入的值作为密钥或者用C语言的random函数、java的Random类生成密钥,由于随机性不足,都不能产生足够安全的密钥,不随机的密钥为攻击者暴力破解密钥带来了便利。
二
密钥安全策略剖析
针对密钥在使用过程中产生的风险下面列举了七个密钥管理策略,为各组织机构设计密钥管理流程和程序,实施安全的密钥管理提供参考。
1、密钥与源码分离
系统使用密钥是为了保护用户数据,所以应该在系统部署运行阶段由用户自己生成密钥,而不是在系统开发阶段由厂商生成密钥。每个用户密钥都应是唯一的,由用户自己独有,未经授权其他人不能通过任何渠道获得用户密钥。开发阶段生成的密钥,会随程序版本发布给每个用户,每个用户都能用程序中的密钥解密其他用户的秘密。因此源代码中不应存在任何硬编码密钥,值得注意的是,源代码中除了不应存在硬编码的密钥明文,也不应存在硬编码的密钥密文,因为理论上只要有充足的时间任何密钥都能被暴力破解,而程序会被用户长期使用,所以程序中的硬编码密钥密文也不安全。
2、密钥分类
各组织机构在密钥管理过程中,应该首先根据自身业务特点,对工作秘密进行分类,然后为每一类工作秘密分配一个工作密钥,确保一把钥匙只开一把锁。通过密钥隔离机制可以防止攻击者绕过正常的访问控制解密非授权数据,实现数据访问权限最小化。
3、密钥分层加密存储
为了保护密钥的机密性,需要对密钥进行加密存储,加密密钥的密钥又需要加密存储,如此会陷入鸡生蛋、蛋生鸡的无解循环中。为避免此类问题,需要对密钥进行分层管理,用工作密钥保护工作秘密,用密钥加密密钥(KEK)保护工作密钥,用根密钥保护密钥加密密钥,最后由一个可信的访问控制域保护根密钥。
4、密钥定期更新
与口令长时间使用的风险类似,密钥长时间使用同样会增加密钥泄露风险,也需要定期更换密钥来防止密钥泄露后对系统持续产生威胁。根据密钥类型的不同,更新的周期也不尽相同,密钥使用越频繁,密钥的更新周期应该越短。与口令更换不同的是,密钥更新会导致已加密的数据密文发生变化,需要用原密钥解密数据,再用新密钥重新加密。
5、密钥强度符合标准规范
密钥的强度取决于随机性和密钥长度两个因素,两者都需要满足国家标准和行业规范要求。一般情况下,为了避免随机性不足,密钥的产生禁止采取手动输入的值或时钟作为密钥。另外C语言的random函数或者Java的Random类等随机数生成程序的随机源的熵足,不能生成真正随机的随机数,也应禁止作为密钥产生的依据。为了确保密钥强度的合规,业界最佳实践是使用密钥派生函数KDF生成符合密钥长度要求和随机性要求的密钥。
6、密钥支持备份恢复
随着密钥管理措施越来越严格,获取密钥和使用密钥的过程越来越复杂,由此带来很多新的故障点,如根密钥丢失,密钥更新出错等,一旦出现无法恢复的密钥故障,工作秘密将无法解密成明文,造成业务异常,甚至可能导致业务数据不可用。因此,必须设计密钥的备份与恢复机制,当出现故障时能及时从备份中恢复密钥,保持业务正常运转。
7、密钥管理自动化
随着密钥体系的建立,密钥的种类和数量急剧增多,人工管理密钥变得不再现实,需实现密钥管理的自动化。密钥管理的自动化应贯穿密钥的全生命周期。密钥的生成、更新、备份/恢复和销毁阶段,可根据业务需要由管理员执行一键式操作,密钥分发、使用、存储阶段无需人工干预,可实现全过程自动化。
三
密钥安全策略落地方案
为实施上述七个密钥安全策略,规避密钥管理工作的复杂性,各组织机构应在如下三个方面落地:
1、变更源代码支撑加密密钥存储与使用流程
对于尚未支持密钥安全策略的系统而言,应用程序变更少量源代码不可避免。变更后的密钥加密写入配置文件,密钥加密密钥和根密钥通过可信计算技术保护,加解密操作和密钥读写封装成标准API供应用程序调用,支持密钥与源码分离、密钥分类、密钥加密存储等安全策略。
2、增加密钥管理系统实现密钥全生命周期管理
密钥管理系统,简称KMS,支持密钥的全生命周期管理,在生成、分发、更新、备份/恢复和销毁阶段提供一键式操作,实现密钥的分类和自动化管理。目前市场上已经存在一定数量的KMS系统,能够满足密钥分类、定期更新、备份恢复和密钥管理自动化策略。虽然KMS系统能够提供密钥管理功能,但是对于密钥的分层加密存储,尤其是根密钥无法提供保护,也不能提供密钥合规API,这两项策略需应用可信计算技术。
3、引入可信计算技术实现密钥分层加密存储和密钥合规
可信计算技术使用硬件可信密码芯片对密钥提供加密保护,其密钥管理体系天然支持密钥分层管理策略,还能提供硬件级别的随机数发生器和内置合规的国密加密算法,满足密钥强度合规要求,是目前根密钥保护的业界最佳实践。最后将密钥管理系统与可信计算技术结合,可以加强密钥安全体系防护强度,快速构建业界领先的密钥管理系统,落实国家密码法和标准法规国产化、硬件化要求,保障用户数据安全。
四
结语
本文针对当前密钥安全现状进行了分析,指出在密钥设计和运维过程中可能存在的密钥泄露风险,并剖析了解决密钥泄露风险需要采取的七个密钥安全策略,提出密钥安全策略落地的措施,将密钥管理系统与可信计算技术相结合,实现全生命周期自动化密钥管理