如何安全使用加密套件?
如何安全使用加密套件?
對稱加密
- 首選 Chacha20-Poly1305 和 AES-GCM 演算法(AEAD類演算法)
- 不支援 AES-GCM 或 Chacha20-Poly1305 的場景下使用 AES-CBC,避免 ECB、CTR、CFB、OBF 模式
- 避免64bit塊加密演算法,例如 blowfish、TEA 等
- 不要使用RC4
- 不要自行設計加密演算法,除非你在密碼學領域是整個行業公認的專家
- 不要多次迴圈加密,加密強度取決於加密演算法、祕鑰長度,以及正確的實現加密過程。迴圈加密對加密強度沒有實際意義的幫助
原因
- Chacha20-Poly1305,AEAD類演算法;繞開了目前所有已知的漏洞;面向移動網際網路優化;ARM架構上效能更佳
- AES-GCM,AEAD類演算法;TLS 1.3 draft主要的演算法;工業標準;現代CPU有AES-GCM的硬體指令
對稱祕鑰長度
- 對稱祕鑰長度不能低於128 bit,也即16位元組
- 長度超過256 bit的對稱祕鑰沒有實際意義
- 對稱加密、RSA、ECC三種不同型別的演算法中,同樣的祕鑰長度安全性也不同,下面表格中列出來同樣強度情況下,對應不同演算法的祕鑰長度
- 對稱祕鑰生成規則參考本文的 “隨機數生成規範”
Symmetric Key Size (bits) |
RSA and DH Key Size (bits) |
Elliptic Curve Key Size (bits) |
---|---|---|
80 | 160 | 1024 |
112 | 224 | 2048 |
128 | 256 | 3072 |
192 | 384 | 7680 |
256 | 521 | 15360 |
以上資料來自:https://www.globalsign.com/en/blog/elliptic-curve-cryptography/
AES-CBC實現注意事項
必須使用符合加密演算法安全的隨機數生成器,cryptographically strong random number generator (RNG):https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator
- iv必須隨機生成,不能固定;生成規則參考本文的 “隨機數生成規範”
- 避免用祕鑰代替iv
- 避免用 stdlib 系列偽隨機數
隨機數生成規範
隨機生成的iv或者nonce要採用/dev/urandom生成,或者採用基於/dev/urandom實現的隨機數生成器
- 避免採用 stdlib 系列偽隨機數
- 避免 havaged,prngs,egd 等
- 避免 /dev/random ,會因為熵池噪聲資料不足而阻塞幾秒甚至是十幾秒,嚴重影響效能,參考:https://zh.wikipedia.org/zh-cn//dev/random
成熟的Library推薦
- iOS 可以採用 Randomization Services Reference:https://developer.apple.com/library/ios/documentation/Security/Reference/RandomizationReference/
- Android & 服務端Java可以使用 SecureRandom:https://docs.oracle.com/javase/7/docs/api/java/security/SecureRandom.html
- 其他場景:推薦使用libsodium庫,或NaCL庫封裝,或者直接讀取 /dev/urandom
非對稱加密
建議橢圓曲線,避免RSA
主要考慮前向安全性、橢圓曲線效能,以及現代計算機對RSA攻擊能力逐年提升
HMAC演算法
使用SHA2類的演算法:SHA-256,SHA-384,SHA-512,SHA512/256等
避免 SHA-1、MD5、MD6
加密庫選擇
- iOS:建議使用原生的 Common Crypto,來自 Apple 的建議:https://developer.apple.com/cryptography/ ;避免使用 OpenSSL,原因是 OpenSSL 介面不友好、漏洞頻發、版本升級時向下相容性不好
- Android:建議使用 javax.crypto,https://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/package-summary.html
- PC & Mac: 優先使用libsodium和NaCL庫;對應libsodium不支援的加密演算法,考慮統一底層加密庫,同時桌面版對包大小不敏感,可以使用OpenSSL
參考資料
- Apple Cryptographic Libraries: https://developer.apple.com/cryptography/
- javax.crypto: https://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/package-summary.html
- 現代密碼學實踐指南[2015年]:https://blog.helong.info/blog/2015/06/05/modern-crypto/
相關文章
- tonyenc加密擴充套件使用方法加密套件
- 使用phpopenssl擴充套件實現非對稱加密PHP套件加密
- 企業如何選購文件安全加密產品加密
- 網路安全中如何對加密軟體進行安全防護?加密
- Android 安全加密:對稱加密Android加密
- Android安全加密:對稱加密Android加密
- 如何給辦公檔案進行加密安全?企業使用檔案加密軟體的資料安全價值,廣東風奧科技加密
- Java加密與安全Java加密
- 安全加密傳輸加密
- Android 安全加密:非對稱加密Android加密
- Android安全加密:非對稱加密Android加密
- 蘋果應用加密軟體如何使用蘋果加密
- Android 安全之如何反編譯與加密apk包Android編譯加密APK
- Android安全之如何反編譯與加密apk包Android編譯加密APK
- Java安全之安全加密演算法Java加密演算法
- 如何擴充套件Django使用者模組套件Django
- 電腦終端資料如何加密更為有效安全?2021河北win透明加密工具軟體使用,保定風奧科技加密
- PHP 如何安全的使用 MySQL ?PHPMySql
- [Chromium]如何安全的使用PostTask
- 在Dubbo-go中使用TLS加密進行安全通訊GoTLS加密
- NAS上如何建立和使用加密資料夾?加密
- 網路安全:加密技術加密
- 如何鹽加密加密
- 資料為王時代 愛加密如何深耕移動應用安全?加密
- 後門戰爭:端到端加密聊天如何成為安全逆鱗?加密
- PHP的Sodium加密擴充套件函式了解PHP加密套件函式
- 設計圖紙如何進行保護對企業來說更安全?加密控制使用許可權的公司加密方案吉林風奧科技加密
- 應用流化技術是如何實現資料雲加密安全的?加密
- 安全篇-AES/RSA加密機制加密
- 原始碼安全加密解決方案原始碼加密
- .net程式混淆、安全、保護、加密加密
- Google釋出Chrome加密擴充套件End-To-EndGoChrome加密套件
- 如何正確安全使用伺服器?伺服器
- 如何加密傳輸和儲存使用者密碼加密密碼
- 微信安全嗎?微信MMTLS加密協議安全性分析TLS加密協議
- Vue使用AES加密Vue加密
- 網路安全 與 加密演算法加密演算法
- OceanBase 安全審計之透明加密加密