https優化必須瞭解ChaCha20-Poly1305演算法
前幾天看到某個公眾號發的一遍關於HTTPS優化的文章,進去一看,全是錯誤的觀點,給自己的感覺非常不好。
- 這篇文章下的留言完全文不答題,可見大家都是走馬觀花,看的文章越多,就很難去辨別真假和實踐了。
- HTTPS優化其實沒有太多的技巧,大家在網路上看到一篇優化文章,一定要留意發表時間,隨著時間的推移,這些技巧可能已經過時,一定要看官方的介紹(比如 OpenSSL)。
基於這兩個問題,我談一談那篇文章提到的二個概念(分別是ChaCha20-Poly1305演算法和等價加密演算法組),分兩篇文章講解,希望給你更多的思考。本文主要講解ChaCha20-Poly1305演算法的方方面面。
AEAD
一圖勝千言:

在HTTPS協議(TLS協議中)中,密碼庫(OpenSSL、NSS)在進行資料加密的時候,涉及到兩種演算法,分別是對稱加密演算法和MAC演算法,為保證機密性和完整性,這兩種演算法必須同時存在。
對於密碼庫(比如OpenSSL)來說,如果由它結合處理對稱加密演算法和MAC演算法,有的時候會出現安全問題,CBC 迭代會遇到填充攻擊,也就是說 傳統加密模式 存在安全風險。
這時候就出現了 AEAD 加密模式,它在內部自行處理加密和MAC運算,無須密碼庫(比如OpenSSL)處理,安全性更高,而ChaCha20-Poly1305也採用AEAD加密模式。
單獨從加密演算法的角度來看,分為塊加密演算法和流密碼加密演算法,RC4是一種流密碼加密演算法,但由於安全問題,已經基本不在HTTPS中使用了,塊加密演算法比較流行的就是 AES 演算法,而ChaCha20-Poly1305是一種流加密演算法。
現在我們從整體上了解了ChaCha20-Poly1305演算法的定位,如果你想了解更多 AEAD 的知識,可以參考我寫的書《深入淺出HTTPS:從原理到實戰》。那麼和AES-GCM相比,它有哪些優點呢?它為什麼出現呢?
效能
對於 AES 這樣的塊加密演算法來說,在某些硬體上執行的非常快,比如現在的伺服器和桌上型電腦都有AES-NI加速指令。而如果沒有加速指令,純粹通過軟體執行,效能是很低的。
而流密碼演算法剛好反過來,軟體實現效能更高,大部分移動裝置(比如手機)由於沒有AES-NI支援,執行 AES 加密是很緩慢的。執行 RC4 這樣的流加密演算法速度相對較快,可惜的是 RC4 早已經被證明不安全了。
這個時候ChaCha20-Poly1305流密碼演算法來了,除了安全性外,它在移動裝置上執行的效能較高。大部分觀點認為,在移動裝置上(沒有AES-NI指令),ChaCha20-Poly1305 演算法的效能是 AES-128-GCM 的三倍;當然在桌上型電腦和伺服器上,AES-128-GCM 效能比ChaCha20-Poly1305更高。
Adam Langley 在 2014 年做過一個性能測試,見下面的表格:
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 (AESNI) |
900 MB/s |
500 MB/s |
歷史
ChaCha20-Poly1305 演算法是Google 2013年提出來的,11月份在Chrome 31版本啟用了該演算法,2014年4月所有的IOS裝置和Android裝置上的Chrome也啟用了。firfox的密碼庫用的是 NSS,NSS 3.23 版本支援 ChaCha20/Poly1305。
Flare/">CloudFlare在2015年2月也支援了ChaCha20/Poly1305演算法,經檢測有10%的流量使用了這種演算法。
不過不管是Google還是CloudFlare,他們實現的ChaCha20/Poly1305演算法都不是最終的版本,從2015年開始,IETF 對這一演算法進行了標準化,歷經了多個草案(https://tools.ietf.org/html/draft-mavrogiannopoulos-chacha-tls-05),最終在2016年6月定稿了(https://tools.ietf.org/html/rfc7905)。
作為世界上最流行的密碼庫和TLS庫,OpenSSL從 1.1.0(2016年8月)開始支援 ChaCha20-Poly1305 演算法。如果你使用的是 OpenSSL 版本較舊,可以使用 CloudFlare 開發的 patch(https://github.com/cloudflare/sslconfig/blob/master/patches/openssl__1.1.0_chacha20_poly1305.patch)
Nginx 支援
Nginx使用的密碼庫是 OpenSSL,只要 OpenSSL 版本支援該演算法,那麼 Nginx 就能使用,配置非常簡單,比如 mozilla 推薦的配置:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers on;
我會長期關注HTTPS方面的進展,所有寫的文章都不是從《深入淺出HTTPS:從原理到實戰》搬移的,都是我最新學習的,歡迎大家關注,我的公眾號(ID:yudadanwx,虞大膽的嘰嘰喳喳)