背景
現在大部分網站都採用 https 協議來傳輸資料,客戶端和服務端自動透過證書完成金鑰協商和資料加密傳輸的過程。
但是,https 證書一般都是要收費的,因此有些網站開發時還會直接使用 http 協議,這種情況下就需要對敏感資料比如帳號、密碼等資訊進行加密傳輸。這個過程其實就是一個 https 協議傳輸的過程,只是需要網站自己實現加密傳輸邏輯。
考慮到加密解密的效率問題,可以只對網站的敏感資料加密傳輸。本文來探討基於 Vue.js + Java Web 的網站實現敏感資料加密傳輸的流程及重要邏輯。
https 通訊流程要實現加密傳輸,需要先了解 https 的通訊流程,其本質就是前後端協商非對稱加密公鑰和 對稱加密私鑰對過程,詳細可參考這篇:
目前金鑰協商的非對稱加密演算法主要有兩種 RSA 和 DH 演算法,這裡以大家熟悉的 RSA 演算法為例來介紹協商流程:
流程說明:
客戶端發起 https 請求。伺服器端收到請求後,生成 RSA 金鑰對,私鑰自己保留,公鑰傳送給客戶端。客戶端隨機選用一個字串,作為資料加密的金鑰,並用公鑰對該金鑰加密,傳遞給伺服器端。伺服器收到加密後的金鑰後,使用私鑰解密,得到金鑰資訊。接下來二者就可以通訊了:客戶端用金鑰對資料加密,服務端用相同金鑰進行解密。第 3、4 步就是雙方交換金鑰的過程,從這個流程可以看出,伺服器端的私鑰一旦洩露,金鑰也就洩露了。為什麼伺服器端的私鑰會有洩露的風險呢?私鑰通常是以檔案形式存在的,如果檔案系統被攻破,私鑰洩露,那麼資料當然就不安全了。
http 協議加密傳輸流程如果網站直接使用 https 證書構建,那麼加密過程會自動完成,客戶端和網站的所有資料傳輸都自動走加密傳輸。如果沒有能力使用 https 協議,那麼直接按照 https 的握手流程實現金鑰協商過程即可。
協商過程使用非對稱加密演算法 RSA 和 對稱加密演算法 AES ,它們的作用是:
RSA 非對稱加密:公鑰加密是、私鑰解密,加密效率低,用來傳輸 AES 演算法的金鑰AES 對稱加密:加密解密共用相同金鑰,效率高,用來傳輸敏感資料前後臺提供一致的加密演算法,Java 本身提供了 RSA 和 AES 演算法支援,而前端在 package.json 中新增下面依賴即可:
"crypto-js": "^3.1.9-1", // AES 對稱加密演算法的實現 "jsencrypt": "3.0.0-rc.1", // RSA 非對稱加密演算法的實現。
後臺需要提供三部分邏輯:
getPublicKeys:獲取 RSA 加密公鑰的請求handshake:解密前端的 AES 金鑰,並存儲到全域性會話中decrypt:用 handshake 階段收到的金鑰,對有加密資料的請求引數進行解密整個流程跟第二部分的 https 協議一致:
瀏覽器傳送 getPublicKeys 請求給後臺後臺生成一對 RSA 公鑰對,並將公鑰返回給瀏覽器;瀏覽器隨機生成一個 AES 金鑰串,並用第 2 步收到的公鑰加密後,再發送 handshake請求給後臺後臺用第 2 步留存的私鑰解密,得到 AES 私鑰,並在此用 AES 私鑰對該私鑰加密,將加密結果傳遞給前端;前端用 AES 金鑰對收到的指紋進行解密,將得到的 AES 金鑰和第 3 步的金鑰對比,如果相同,則未篡改就可以進行通訊,否則提示金鑰指紋異常。總結在壓縮成本的情況下,自己實現 https 協議也並不複雜,在瞭解 https 協議的流程後,接下來就可以實現 Vue.js + JavaWeb 後臺的加密傳輸過程了。