互聯(lián)網(wǎng)是一個開放的環(huán)境,危險無處不在奖恰,加密通信是安全的基礎。但是只加密能解決所有問題嗎宛裕?
舉個例子瑟啃,A正在某銀行網(wǎng)站給B轉賬,轉入卡號和金額輸入完成后生成請求報文揩尸,然后加密報文傳送給銀行后臺蛹屿。銀行收到請求后,解密得到明文岩榆,然后解析得到B的卡號和轉賬金額等信息错负,繼續(xù)走后續(xù)轉賬流程。
正常我們會想勇边,既然請求報文已經(jīng)加密犹撒,按理說不應該會有安全問題。但實際上不是這么簡單的粒褒。
? ? ? ?如果傳輸使用對稱加密算法(最常用的)识颊,客戶端和服務端都是用同一個對稱密鑰,那么這個對稱密鑰就存在泄露的可能性奕坟。一旦泄露祥款,攻擊者X可以截獲正常的報文,解密后替換卡號和金額月杉,然后重新用同一個密鑰加密被篡改的報文刃跛,發(fā)送給銀行。銀行解密后得到的是攻擊者X的卡號苛萎,然后A的錢就到了X的賬戶了奠伪。
如何避免這種情況的發(fā)生跌帐,最直接的辦法就是加強密鑰的管理,防止泄露绊率。方法有很多,可以每個報文都使用不同的對稱密鑰究履,做到一報一密滤否。使用ECC橢圓算法實現(xiàn)客戶端和服務端的密鑰交換,從而避免密鑰在網(wǎng)絡上的傳輸最仑。當然藐俺,還有一個辦法就是給報文加簽名。
? ? ? 簽名泥彤,其實就是給報文做個摘要(哈希)欲芹。而且相同的簽名算法得到的摘要是相同的,比如MD5吟吝,SH1菱父,SH256等。簡單的加簽并不能真正的防篡改剑逃,因為攻擊者可以篡改后浙宜,自己生成新的簽名。服務端驗簽還是可以通過的蛹磺。所以加簽一定要包含一些特殊的私有的東西粟瞬,比如個人私鑰。
有了私鑰簽名萤捆,攻擊者就不能輕而易舉的修改簽名裙品。除非他拿到了私鑰,但這種情況神也救不了你了俗或。如果攻擊者篡改報文市怎,然后使用自己的私鑰簽名,服務端收到報文后蕴侣,使用用戶的公鑰來驗簽焰轻,驗簽是失敗的。這樣就能保證用戶的請求報文的安全性與完整性昆雀。