最近一年多,公司在大力提高服务的安全性,我也参与了公司密钥管理系统的建设,做了较多密钥创建/删除/轮换/销毁/安全存储/安全传输/审计方面的工作,不过这篇文章不谈密钥管理,而是总结不同场景下如何选择足够安全的加密算法和密钥。
按业务场景划分主要有两种:落盘加密(encryption of data at rest)和传输加密(encryption of data in transit)。
落盘加密主要采用AES-GCM-256:
不建议使用DES,3DES,RC4(Rivest Cipher 4)和Camellia ciphers等加密算法。
传输加密可以分为几个部分:
1. 传输层加密:主要采用TLS1.2以上,TLS的加密算法是要AES-GCM-256,并且IV要是随机的。
2. 加密hash算法(Cryptographic Hashing): 主要用于数字签名,公钥加密,完整性验证,消息身份验证,密钥协商协议等场景。一般采用SHA-256,也推荐SHA-384/SHA-512。不能使用SHA-1,不安全。不推荐产线使用SHA3-256/SHA3-384/SHA3-512,性能比较差,可以在research项目中尝试。
3. 消息身份验证: Message Authentication Code(MAC) 常用于真实性和完整性校验,推荐采用HMAC Hash方法为SHA-256;也可以采用KMAC:Hash方法是SHA3, CMAC:Hash方法是AES-CBC。
4. 数字签名: 数字签名常用于对某些信息进行认证,一般用非对称密钥,推荐使用:
除了密钥使用,也要考虑密钥的协商和传输算法。通常采用非对称加密算法协商密钥,包括RSA,ECDH(Elliptic Curve Diffie–Hellman)等算法。
另外,password的存储对安全性要求更高,通常并不存储password的密文而是直接采用Hash算法,存储hash值,杜绝password明文泄漏的可能: