原文鏈接:http://chenxuhua.com/blog/openssl-crypto-method/
在選擇加密算法,面對一大長串的選項時,大家都有這樣的疑問,究竟哪種加密方式是最好的呢?
對於加密方式、算法來說,一般安全性與性能呈負相關,越是安全的,對性能要求則更高。
現在主流的加密協議的安全性均能達到標准,因此這里主要討論的最好便是加密性能的優良。
對於 OpenSSL 而言,有三種常見的加密方式:RC4、AES、ChaCha。
單看這三種加密方式,都是非常具有代表性,可以說每種都有優缺點。
AEAD
在傳統的對稱加密協議中,最大的缺陷就是沒有對數據包完整性進行校驗,再加上流加密的特點,導致了攻擊者可以通過窮舉的方式修改密文進行基於服務器行為的主動探測。
在通常的密碼學應用中,Confidentiality(保密)用加密實現,消息認證用 MAC(Message Authentication Code,消息驗證碼)實現。這兩種算法的配合方式,引發了很多安全漏洞,過去曾經有 3 種方法:
- Encrypt-and-MAC (E&M)
- MAC-then-Encrypt (MtE) <- 即 OTA 的做法
- Encrypt-then-MAC (EtM) <- 新協議的做法
然而后來人們發現,E&M 和 MtE 都是有安全問題的,所以 2008 年起, 逐漸提出了「用一個算法在內部同時實現加密和認證」的反法,稱為 AEAD (Authenticated Encryption with Associated Data)。在 AEAD 這種概念里,cipher + MAC
的模式被一個 AEAD 算法替換。
使用了 AEAD 算法的新協議本質上就是更完善的 stream cipher + authentication
,雖然它依然使用的是流加密(StreamCipher),但是通過更完善的數據包完整性驗證機制杜絕了上面所述的可被篡改密文的可能性。
目前以下加密方式支持 AEAD 算法:
- AES-128-GCM
- AES-192-GCM
- AES-256-GCM
- ChaCha20-IETF-Poly1305
- XChaCha20-IETF-Poly1305
但如果是用在路由器上,因為很多路由器 CPU 速度都在 500MHz 以下,並且不支持 AES 硬解,因為在路由器等計算能力弱的設備上使用 AES 加密方式會造成性能影響,所以,之前使用在路由器上的加密方式一般都選 ChaCha20 算法或 RC4-MD5 (特別是 MIPS 架構的處理器)。
性能
支持 AES 指令集情況下:
- 更快(Fast)
- RC4-MD5
- AES-256-CFB
- AES-256-GCM
- ChaCha20
- ChaCha20-IETF-Poly1305
- XChaCha20-IETF-Poly1305
- 更慢(Slow)
不支持 AES 指令集情況下:
- 更快(Fast)
- RC4-MD5
- ChaCha20
- ChaCha20-IETF-Poly1305
- XChaCha20-IETF-Poly1305
- AES-256-CFB
- AES-256-GCM
- 更慢(Slow)
在各類處理器的測試數據:
Chip | AES-128-GCM 速度 | ChaCha20-Poly1305 速度 |
---|---|---|
OMAP 4460 | 24.1 MB/s | 75.3 MB/s |
Snapdragon S4 Pro | 41.5 MB/s | 130.9 MB/s |
Sandy Bridge Xeon (AES-NI) | 900 MB/s | 500 MB/s |
RC4 加密
速度最快,加密簡單易破解,適合內網、低性能設備,推薦使用 RC4-MD5。
- RC4-MD5:使用 RC4 加密 MD5 校驗。
AES 加密
塊加密算法,兼顧效率和安全,適合在擁有 AES 指令集的 CPU 上,推薦使用 AES-256-GCM 。
區別 | AES-XXX-CFB | AES-XXX-CTR | AES-XXX-GCM |
---|---|---|---|
區別 | 僅加密 | 僅加密 | 加密+消息完整性校驗 |
優點 | 加密可並行 | 加密解密均可並行計算 | 加密解密均可並行計算 |
缺點 | 解密串行 |
-
AES-256-CFB:密碼反饋模式(Cipher FeedBack Mode),僅加密無完整性校驗。
-
AES-256-CTR:計算器模式(Counter Mode),僅加密無完整性校驗。
-
AES-256-GCM:伽羅瓦 / 計數器模式(Galois / Counter Mode)支持 AEAD 認證加密,同時完成加密和完整性校驗。
ChaCha 加密
新型的流加密算法,兼顧效率和安全,適合在沒有 AES 指令集的 CPU 上,效率比 AES 高,推薦使用 XChaCha20-IETF-Poly1305 。
-
ChaCha20:Salsa20 算法的改良,僅加密無完整性校驗。
-
ChaCha20-IETF-Poly1305:支持 AEAD 認證加密,同時完成加密和完整性校驗。
-
XChaCha20-IETF-Poly1305:是前者的升級版,擁有更大的隨機數以防碰撞攻擊,支持 AEAD 認證加密,同時完成加密和完整性校驗。
總結
-
在具備 AES 加速的 CPU(例如桌面、服務器)上,建議使用 AES-256-GCM 系列。
-
在移動設備(例如手機、路由器等非 x86 架構的 CPU)上則建議使用 ChaCha20-IETF-Poly1305 系列。
-
如果你是在內網(LAN 或 IPLC 線路)使用,則不必過多擔心安全性問題,RC4-MD5 加密協議將是非常節省性能的選擇。