三種方法實現移動端HTTPS的加速和省電

2021-09-19 11:04:48 字數 3004 閱讀 8528

野狗官網:

公眾訂閱號:wilddogbaas

https**的普及使大家更加關注https效能優化,一般做https優化可能只是針對pc端,在移動端的效果並不理想。去年google就已經在移動端做了https的效能加速,為android平台的chrome瀏覽器增加了乙個新的tls加密套件:chacha20-poly1305,這是專門為移動裝置推出的加密套件。接下來我們深入**如何使用chacha20-poly1305加密套件實現https移動端加速和省電。

下圖是在iphone chrome上開啟google日本**後的加密資訊截圖。

野狗wilddog已經全站支援在移動裝置上更高效能、更省電的加密套件chacha20-poly1305。下面是在chrome上開啟野狗官網的加密資訊截圖。

為了能夠更好的了解chacha20-poly1305,先簡單介紹對稱加密和aes-ni。

在https握手過程,通過非對稱加密協商出對稱加密金鑰,然後使用對稱加密對雙方通訊的資料內容進行加密。非對稱加密是伺服器效能的開銷是巨大的,通過session resume等方法可以進行加速。常見的非對稱加密演算法有rsa、ecdhe等。

在協商出對稱加密金鑰後,https中所有資料內容通訊的加密都使用對稱加密進行。對稱加密分為流式加密和分組加密。

rc4由於存在嚴重安全漏洞,已經基本不再使用;aes-cbc容易遭受beast和lucky13攻擊,使用也逐漸減少,aes-gcm是它們的安全替代,aes-gcm也是目前最為流行的對稱加密演算法。

aes-gcm解決了對稱加密存在的安全問題,但帶來了效能問題。為此,出現了aes-ni(advanced encryption standard new instruction)。aes-ni是intel和amd微處理器上x86架構的乙個擴充套件,可以從硬體上加速aes的效能,目前在伺服器和pc端,cpu對aes-ni的支援率已經非常普及。

測試結果:伺服器開啟aes-ni後,效能提高了5-8倍左右,這與intel官方公布的資料基本是一致的。

測試方法:

可以使用openssl測試也可以使用其他ssl庫測試,因為所有ssl庫都支援aes-128-gcm。

關於aes-ni的指令集,推薦檢視shay gueron編寫的《intel 高階加密標準 (aes) 指令集 (2010)》。

google推出新的加密套件並在所有移動端的chrome瀏覽器上優先使用原因:

chacha20-poly1305避開了現有發現的所有安全漏洞和攻擊;

chacha20-poly1305針對移動端裝置大量使用的arm晶元做了優化,能夠充分利用arm向量指令,在移動裝置上加解密速度更快、更省電;

更加節省頻寬,poly1305的輸出是16位元組,而hmac-sha1是20位元組,可以節省16%的overhead消耗。

通過實際的測試資料來看看chacha20-poly1305在移動端使用的優勢。

測試一:

在支援aes-ni擴充套件的裝置上,aes加密的效能優勢是明顯的。 目前最為常用的對稱加密aes-128-gcm的效能是chacha20-poly1305的近5倍。

測試方法:

進入到編譯後的libressl目錄,通過下面的命令測試。

測試二:

在不支援aes-ni擴充套件的移動裝置上,chacha20-poly1305的效能是aes-gcm的三倍左右。

對稱加密最合理的使用方法是:在支援aes-ni的裝置上,優先使用aes-128-gcm加密套件;在不支援aes-ni的移動裝置上,特別是arm架構的裝置上,優先使用chacha20-poly1305加密套件。

openssl官方版本目前不支援chacha20-poly1305,所以不能使用原生的openssl版本。關注openssl官方的動態( )。

在nginx上實現chacha20-poly1305主流的方法有三種:

使用openbsd從openssl fork的分支libressl;

使用google從openssl fork的分支boringssl;

使用cloudflare提供的openssl patch。

編譯安裝方法最為簡單;

openbsd小組對openssl的**進行了全面清理並重構,更為輕量;

已經發布穩定版本,相比於openssl團隊,問題修復更及時。

支援等價加密演算法組功能(equal preference cipher groups),這功能我認為很有意思,在後面部落格中再介紹;

與nginx編譯友好性不足,編譯容易出錯,至少需要修改兩處原始碼;

不支援ocsp stapling功能。這一點是比較有意思的,google工程師在部落格上說ocsp stapling存在缺陷,目前不支援,但不排除後面支援的可能性。聯想到chrome瀏覽器預設也不使用ocsp,可見google對ocsp的情感是複雜的。

編譯安裝過程較為複雜;

openssl本身較重,存在的安全問題也多,需要頻繁公升級版本;

穩定性需要進一步驗證。

物體移動 三種方法

api transform.translate 直接對物體座標進行操作 api 3d rigidbody.velocity new vector3 speed.x,speed.y,speed.z 2d rigidbody.velocity new vector2 speed.x,speed.y 對剛...

Python實現 移動零 的三種方法

給定陣列nums,寫乙個函式將陣列中所有零移動到陣列尾,並且保持非零元素的相對位置不變 example input 0,1,0,3,12 output 1,3,12,0,0 注意 你必須在原陣列上進行操作,不能拷貝額外的陣列 最小化操作的次數 def movezeroes self,nums typ...

移動無邊框窗體的三種方法

1.重寫wndproc protected override void wndproc ref message m else 2.建立訊息 private const int wm nclbuttondown 0x00a1 private const int wm nchittest 0x84 pr...