加密算法的使用場景
最近一年多,公司在大力提高服務的安全性,我也參與了公司密鑰管理系統的建設,做了較多密鑰創建/刪除/輪換/銷毀/安全存儲/安全傳輸/審計方面的工作,不過這篇文章不談密鑰管理,而是總結不同場景下如何選擇足夠安全的加密算法和密鑰。
按業務場景劃分主要有兩種:落盤加密(encryption of data at rest)和傳輸加密(encryption of data in transit)。
落盤加密主要采用AES-GCM-256:
- key長度如果不能達到256,至少也要采用128bit
- mode推薦采用GCM,如果不支持GCM可以采用GCM-SIV/CCM/EAX/CBC,ECB模式不夠安全不建議使用;
- IV必須是96bits長度, 對于落盤加密場景使用random IV,key使用過232次之后要換個新值;
- AAD(Additional AUthenticated Data)可加可不加,AAD的值要是不敏感的。
不建議使用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: RSA key長度不小于2048bits,如果預期key會用一年以上,則長度不小于4096bits。Padding模式推薦PSS和OAEP
- ECDSA: 如果是用一個長期不變的加密key推薦用secp384r1模型,如果是用于TLS推薦用secp256r1,不能使用Brainpool curves
除了密鑰使用,也要考慮密鑰的協商和傳輸算法。通常采用非對稱加密算法協商密鑰,包括RSA,ECDH(Elliptic Curve Diffie–Hellman)等算法。
- RSA常用于密鑰傳輸和數字簽名。
- ECDH用于密鑰協商, 如果不能采用ECDH,也可以采用DH算法。
另外,password的存儲對安全性要求更高,通常并不存儲password的密文而是直接采用Hash算法,存儲hash值,杜絕password明文泄漏的可能:
- 算法采用PBKDF2 with HMAC-SHA-256
- PBKDF2的迭代至少100,050次數
- 鹽值(Salt)至少256bits

浙公網安備 33010602011771號