昨天寫了一篇使用者密碼儲存的安全性後,有讀者留言詢問關於如何保障客戶端和服務端資料傳輸的安全性,這個話題在過去幾年正好是我特別關注的一個點,所以我今天試著用我的經驗來解答這個問題。
和密碼儲存一樣,如果客戶端的發出來Request通過明文傳輸是相當危險的,資料包一旦被中途擷取到,通過常用的抓包軟體,Charles或者Fiddler都能直接解析拿到客戶端的請求資料,例如使用者名稱密碼之類。所以我們需要資料加密,包括走HTTPS協議。
資料加密的方式
對於資料傳輸加密,簡單來看分為兩類(實際上還有一類叫做單向加密,這裡不展開):對稱加密方式和非對稱加密方式。
顧名思義,對於對稱加密方式,傳送方和接收方都使用同一個金鑰對資訊進行加密、解密。所以對稱加密的優點和不足都是很明顯的: 優點是對稱加密方式速度很快,缺點是不同型別的通訊端需要維護不同的金鑰,同時由於客戶端和服務端都需要儲存金鑰,所以金鑰洩密的潛在可能性也更大。
非對稱方式規定了金鑰需要有一對兒一個公鑰(Public Key)和一個私鑰(Private Key/Security Key),如果用公鑰加密資訊,就需要用相同配對的私鑰才能解密,反之亦然。非對稱方式的特點是資料可靠性相當強,很大程度上保證了身份認證。
數字證書的作用
不過無論是對稱或者非對稱方式,都不具備防禦中間人攻擊的能力。當主機A和主機B通訊時,即便他們中間插入了一個"轉發"主機C, A、B都不會意識到,而繼續以為它們之間是在直接通訊。C可以不僅竊聽A、B的通訊還可以對資訊進行篡改再傳給對方,C便可以將惡意資訊傳遞給A、B以達到自己的目的。
防止中間人攻擊的方法實際上就是身份證認證方式,目前主流方式就是數字簽名的方式,但是也是存在利用不對稱資訊、時間戳、生物資訊、物理資訊等其它成熟或者是不成熟,公開或不公開的解決方式。
數字證書是經過權威機構(CA)認證的公鑰,通過檢視數字證書,可以知道該證書是由那家權威機構簽發的,證書使用人的資訊,使用人的公鑰。它有以下特點:
1、由專門的機構簽發的數字證書才安全有效。
2、簽發數字證書是收費的。
3、不會被冒充,安全可信。
4、數字證書有使用期限,過了使用期限,證書變為不可用。CA也可以在試用期內,對證書進行作廢操作。
因此,在實際中數字證書+ RSA加密的辦法來保障資料傳輸的安全性。
API訪問改走HTTPS
上面提到的數字證書在現實中實施的例項就是HTTPS協議,所以除了程式碼層面上通過RSA加密,我們還會將API訪問統一改走HTTPS協議,可以從根本上解決資料被篡改的可能性:
1. 避免運營商強插廣告,甚至在正常結果前面插一條廣告(天朝特色)
2. 手機客戶端上被瀏覽器或者惡意軟體篡改或者劫持
3. 阻止使用者資料洩露
考慮到之前OpenSSL的滴血漏洞,資料傳輸的安全性絕不是一勞永逸的,需要時刻保持警惕。
掃描二維碼或手動搜尋微信公眾號【架構棧】: ForestNotes
歡迎轉載,帶上以下二維碼即可