AES使用的正确姿势
2020-06-13
昨天碰到一个敏感信息需要存入数据库的问题, 其实关键三个问题:
- 怎么选择加密方式
- 怎么保存IV(初始化向量)
- 怎么保存秘钥
加密方式
加密我们选用是AES, 但加密模式(encryption mode)很多, 用的比较普遍的有:
- ECB (Electronic codebook, 电子密码本): 简单, 加密只有密钥一个参数. 但是秘钥, 明文不变时, 产生的密文是一样的, 不能防止重放攻击
- CBC (密码分组链接,Cipher-block chaining): 配合随机的IV使用, 无重放问题. 加密复杂.
一般存放敏感信息的场景, 是不适合使用ECB模式的.
IV
但是使用CBC模式, 如果IV不随机, 甚至使用不变的IV, 也会有重放问题.
那么IV信息需要保护吗? 可以明文存储吗?
答案是IV并非敏感信息, 但IV的生成要完全随机, 每次加密都使用不同的IV.
最后, 我们的设计是: 在数据库中存储加密的敏感信息时, 自己做编码, 将IV+加密后的秘文base64后存在一个varchar中. 解密时, 需要先解出IV和密文, 配合秘钥才能解出原始信息.
秘钥
秘钥肯定是要安全保存的, 有几个方案:
- 如果有配置中心, 秘钥是作为敏感配置存储的, 只有程序启动时才能读取. 此类配置由专人管理, 开发人员无修改和查看权限.
- 借助云厂商的机制, 譬如AWS的Secrets Manager配合IAM使用.
后记
看到很多网上文章中的AES加解密示例, 将IV设置为固定值, 或者将IV设置为秘钥的前N位, 应该是个错误.