HCM

Happy Coding Monkey

AES使用的正确姿势

2020-06-13


昨天碰到一个敏感信息需要存入数据库的问题, 其实关键三个问题:

  1. 怎么选择加密方式
  2. 怎么保存IV(初始化向量)
  3. 怎么保存秘钥

加密方式

加密我们选用是AES, 但加密模式(encryption mode)很多, 用的比较普遍的有:

一般存放敏感信息的场景, 是不适合使用ECB模式的.

IV

但是使用CBC模式, 如果IV不随机, 甚至使用不变的IV, 也会有重放问题.

那么IV信息需要保护吗? 可以明文存储吗?

答案是IV并非敏感信息, 但IV的生成要完全随机, 每次加密都使用不同的IV.

最后, 我们的设计是: 在数据库中存储加密的敏感信息时, 自己做编码, 将IV+加密后的秘文base64后存在一个varchar中. 解密时, 需要先解出IV和密文, 配合秘钥才能解出原始信息.

秘钥

秘钥肯定是要安全保存的, 有几个方案:

后记

看到很多网上文章中的AES加解密示例, 将IV设置为固定值, 或者将IV设置为秘钥的前N位, 应该是个错误.

参考

  1. Wikipedia: Block cipher mode of operation
  2. When using AES and CBC, is it necessary to keep the IV secret?