根密钥保护,是一个重要且复杂的议题,因为根密钥是整个加密体系中最核心的部分。
这里所说的根密钥,其背后往往涉及的是一个密钥保护链,这个密钥保护链最终服务的就是业务系统中的敏感数据。
对于意识到敏感数据不能直接明文暴露的开发者或产品团队来说,往往会直接选择对称加密算法来对数据做加密,以达到隐藏明文数据的效果。
这里最常见的对称加密算法包括 AES-CBC、AES-GCM、SM4 等,这些算法同时兼顾了运算性能和安全性,对业务的运行带来的影响可以降到最低。
比如使用易加密工具进行 AES-CBC 模式加密数据:
# 安装工具
❯ 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,可以将密文还原为明文。
❯ 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,那么将无法得到明文数据或得到错误的明文数据:
❯ 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系列(中):PaddingOracle填充攻击分析与启示》
对于一些业务系统来说,在成功的隐藏数据之后,也需要能够依据某些数据特征,对数据进行比对。
比如对于明文数据:张三 13211092209 421097199809232342
,再通过对称加密将其变为密文数据后,在一些关键的查找逻辑上,我需要知道此时的明文数据究竟是不是可以匹配上,但是明文又不能直接暴露或存储,因此此时会有业务系统考虑使用 hash 算法对明文做特征提取,比如使用 sha256:
❯ echo "张三 13211092209 421097199809232342" > test_data.bin
❯ cat test_data.bin
张三 13211092209 421097199809232342
❯ sha256sum test_data.bin
278dfdadc035c68bc6709c2efd0eb63035dfbf15a5e5c852020e63d78bf95a4f test_data.bin
使用高强的哈希算法是一种不错的选择,但是对于某些固定的数据,如手机号码、身份证号号码等,由于 hash 算法本身的一些特性,对于已经掌握了部分敏感数据的人来说,还是容易对数据做出碰撞,比如假设某些黑客已经有了大量的明文手机号码库或身份证号码库,那么对这些数据算出其固定的 hash 值是很简单的,使用这些计算出来的值再去对业务系统的数据做碰撞比对,难度会降低很多。
使用 HMAC 可能是比哈希算法更安全的做法。
❯ 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 算法使用的内容可以参考我以前的文章:
从上面的代码示例其实不难得出,对数据的保护,其实就是对密钥的保护。
无论是对称加密的密钥:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
还是数据 HMAC 密钥:my_hmac_key_for_data
,二者的泄露,尤其是对称密钥的泄露,将会对数据的安全性造成极大的隐患。
密钥本身也是一种数据,因此,数据的保护依赖于数据密钥,而数据密钥的保护,又依赖于保护数据密钥的密钥,这里我们统一称其为根密钥。
基于根密钥的密钥保护链,构成了数据保护的一种范式。
根密钥是整个链式保护体系的信任基础,根密钥的泄露将会导致整个信息体系的崩塌。
常见的密钥保护体系有以下几种:
从图中不能发现,静态的根密钥具有单点风险,大致可以描述为:
根密钥的动态化是链式密钥保护体系中比较好的一种落地方式。
有助于提高整个加密体系的安全性和灵活性。
池化的根密钥,可以有以下好处:
自动轮转的根密钥可以带来以下显而易见的好处:
对于物理密码设备的访问,严格遵守多因素访问控制流程是一种推荐的做法。
理论上,我们可以从以下几方面来验证人的身份:
对于基于网络远程访问的路径,其多因素认证流程大致如下:
程序的身份认证始终都是一个难题,尤其在涉及到程序访问根密钥时,很容易陷入无限依赖的情况。
比如通过为程序颁发数字证书,只有数字证书校验通过才允许程序访问根密钥,但是如果数字证书被泄露或被中间人窃听,那么最后还是会陷入到对身份根证书的无限依赖中。
程序的身份认证最终的问题是要解决好在安全性、可用性、性能和成本之间平衡的问题。、
如果对于程序的身份验证也引入类似于多因素认证的逻辑步骤,难么对于常规的分布式、多集群的业务,将会带来巨量的运维和维护成本,并且会对业务系统自身的可扩展性带来巨大的伤害。
当然,除开技术手段的原因外,内部人员带来的威胁也是一个巨大的隐患。内部人员很可能由于疏忽或恶意行为,绕过身份认证机制,导致安全策略失效。
对于运维场景下的低频运行的程序,可以适当引入多因素的身份认证,以解决身份泄露导致的根密钥泄露问题。而对于常规的分布式、集群化的业务程序,则更需要配合事前、事中、事后的监测手段,来收敛爆炸面积,降低风险带来的损伤。
无法通过技术手段闭环的安全问题,最终几乎都是人的问题。
职业道德的培养有助于建立一个信任的环境,员工会主动保护根密钥和身份认证信息,避免内部威胁的发生。
职业道德还涉及到对员工进行道德和法律后果的教育,使他们意识到违反安全规定可能带来的严重后果。
安全意识的提高有助于员工在日常工作中采取正确的行为,比如警惕钓鱼邮件、使用强密码、及时报告可疑行为等。
安全意识还体现在编码和运维场景中,比如:
总的来说,职业道德和安全意识培养是根密钥保护和身份认证保护的基石,它们是主动安全防护中的关键一环。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。