作為一個開發(fā)人員,或多或少都聽說過對稱加密、非對稱加密、摘要、數(shù)字簽名、數(shù)字證書這幾個概念,它們是用來保證在互聯(lián)網通信過程中數(shù)據傳輸安全的。有人可能會有疑惑,我給傳輸數(shù)據加個密不就安全了,為什么還要搞這么多花樣出來?本文主要通過一個案例來講解這幾個概念的實際作用。
在此之前,我先簡單介紹一下這幾個概念。
1.名詞解釋
對稱加密
對稱加密是指用來加密和解密的是同一個秘鑰。其特點是加密速度快,但是秘鑰容易被黑客截獲,所以安全性不高。常見的有AES、DES算法。
非對稱加密
非對稱加密是指用來加密和解密的是不同的秘鑰,它們是成對出現(xiàn)的,稱為公鑰和私鑰,知道其中一個秘鑰是無法推導出另外一個秘鑰的。用公鑰加密的內容需要用私鑰才能解密,用私鑰加密的內容需要用公鑰才能解密。非對稱加密的特點是安全性高,缺點是加密速度慢。常見的有RSA算法。
摘要
所謂的摘要就是一段信息或者一個文件通過某個哈希算法(也叫摘要算法)而得到的一串字符。摘要算法的特點就是不同的文件計算出的摘要是不同的(也有可能相同,但是可能性非常非常低),比如一個1G的視頻文件,哪怕只是改動其中一個字節(jié),最后計算得到的摘要也是完全不同的,所以摘要算法通常是用來判斷文件是否被篡改過。其還有一個特點就是通過摘要是無法推導出源文件的信息的。常用的摘要算法有MD5、SHA等。
數(shù)字簽名
數(shù)字簽名就是一個文件的摘要加密后的信息。數(shù)字簽名是和源文件一起發(fā)送給接收方的,接收方收到后對文件用摘要算法算出一個摘要,然后和數(shù)字簽名中的摘要進行比對,兩者不一致的話說明文件被篡改了。
數(shù)字證書
數(shù)字證書是一個經證書授權中心生成的文件,數(shù)字證書里一般會包含公鑰、公鑰擁有者名稱、CA的數(shù)字簽名、有效期、授權中心名稱、證書序列號等信息。其中CA的數(shù)字簽名是驗證證書是否被篡改的關鍵,它其實就是對證書里面除了CA的數(shù)字簽名以外的內容進行摘要算法得到一個摘要,然后CA機構用他自己的私鑰對這個摘要進行加密就生成了CA的數(shù)字簽名,CA機構會公開它的公鑰,驗證證書時就是用這個公鑰解密CA的數(shù)字簽名,然后用來驗證證書是否被篡改。
2.案例講解
場景:
張三要找人裝修一個房子,原則是誰的出價便宜就給誰裝修,所以對于報價文件就是屬于機密文件。下面我們來看下不同的方式傳輸報價文件都會有什么風險。
2.1 通過對稱加密有什么風險
現(xiàn)在李四想接這個裝修的活,他做了一份報價文件(文件名:lisi.txt,文件內容:報價50萬)。然后李四用一個對稱秘鑰123對這個文件進行加密。最后李四將這個秘鑰和加密的文件發(fā)給張三,張三收到后用這個秘鑰解密,知道了李四的報價是50萬。
同時王五也想接這個裝修的活,他本來是想報價55萬的,但是又擔心報價太高而丟掉這個活。恰巧王五是個黑客高手,于是他截獲了李四發(fā)給張三的秘鑰和加密文件,知道了李四報價是50萬。最后王五將自己的報價改成了49萬發(fā)給張三,結果王五接下了這個裝修活。
結論:
用對稱加密的話,一旦秘鑰被黑客截獲,加密就形同虛設,所以安全性比較低。
2.2 如果用非對稱加密會怎么樣
首先張三會生成一對秘鑰,私鑰是zhangsan1,公鑰是zhangsan2,私鑰張三自己保存,將公鑰公布出去。
李四將報價文件list.txt用張三公布的公鑰zhangsan2進行加密后傳給張三,然后張三用私鑰zhangsan1進行解密得到李四的報價是50萬。
這個時候即使王五截獲到了李四發(fā)給張三的報價文件,由于王五沒有張三的私鑰,所以他是無法解密文件的,也就無法知道李四的報價。最后王五因為報價55萬而丟掉了這個裝修的機會。
所以用非對稱加密是可以保證數(shù)據傳輸安全的。不過這里說一句題外話,既然非對稱加密安全性高,那為什么不淘汰掉對稱加密呢?其實關鍵就在于加密速度,非對稱加密計算量很大,所以加密速度是很慢的,如果發(fā)送消息非常頻繁,使用非對稱加密的話就會對性能造成很大影響。所以在實際開發(fā)過程中通常是對稱加密和非對稱加密結合使用的。也就是對稱加密的秘鑰是用非對稱加密后發(fā)送的,這樣能保證對稱加密的秘鑰不被黑客截獲,然后在發(fā)送業(yè)務數(shù)據時就用對稱加密。這樣既保證了安全性也保證了加密速度。
結論:
非對稱加密可以防止黑客截獲加密后的內容,安全性高。
2.3 數(shù)字簽名有什么用
前面都說了非對稱加密是安全的,那為什么還要數(shù)字簽名呢?
設想一下,王五截獲了李四的報價文件,王五雖然無法知道李四的實際報價,但是他完全可以偽造一份李四的報價(文件名:lisi.txt,文件內容:報價60萬),然后將這份偽造文件用張三公布的公鑰zhangsan2進行加密后替換原來的報價文件。張三收到后解密發(fā)現(xiàn)報價是60萬,于是張三就以為李四報的價是60萬,最后決定將裝修的活給報價55萬的王五來做。
發(fā)生這個問題的關鍵就在于張三無法知道報價文件是否被篡改過。要解決這個問題就需要用到數(shù)字簽名。
首先李四需要自己生成一對非對稱加密的秘鑰,私鑰lisi1自己保存,公鑰lisi2發(fā)給張三。然后李四對自己的報價文件通過摘要算法得到一個摘要(假設摘要是aaa),再用自己的私鑰lisi1加密這個摘要就得到了報價文件的數(shù)字簽名,最后將加密的報價文件和數(shù)字簽名一起發(fā)給張三,張三收到后先用李四發(fā)過來的公鑰lisi2解密數(shù)字簽名得到摘要aaa,然后用自己的私鑰zhangsan1解密加密的文件得到報價源文件,然后對報價源文件進行摘要算法,看計算得到的結果是不是aaa,如果不是aaa的話就說明報價文件被篡改了。
在這種情況下,如果王五截獲了李四發(fā)給張三的文件。王五是無法解密報價文件的。如果王五偽造一份報價文件的話,等張三收到后就會發(fā)現(xiàn)報價文件和數(shù)字簽名不匹配。那王五能不能偽造報價文件的同時也偽造簽名呢?因為王五沒有李四的私鑰,所以沒法對偽造的報價文件的摘要進行加密,所以也就沒法偽造簽名。
結論:
非對稱加密雖然能確保加密文件內容不被竊取,但不能保證文件不被篡改。數(shù)字簽名就是用來驗證文件是否被篡改過。
2.4 數(shù)字證書有什么用
既然非對稱加密可以保證文件內容的安全性,數(shù)字簽名又可以保證文件不被篡改,那還要數(shù)字證書有什么用呢?
我們再來設想一下,王五自己也生成了一對用于非對稱加密的秘鑰,私鑰是wangwu1,公鑰是wangwu2。前面李四將自己的公鑰lisi2發(fā)給張三的過程中被王五給截獲了,王五用自己的公鑰wangwu2替換了李四的公鑰lisi2,所以張三最后收到的公鑰實際上是王五的,但張三對這并不知情。后面李四發(fā)的數(shù)字簽名和加密的報價文件都被王五截獲,并且王五偽造了一份報價文件,同時用自己的私鑰加密報價文件的摘要生成偽造的簽名并發(fā)給張三,張三收到后進行驗證發(fā)現(xiàn)數(shù)字簽名和報價文件是匹配的,就以為這份報價文件是真實的。
出現(xiàn)這個問題的關鍵就在于張三沒法確認收到的公鑰到底是不是李四發(fā)的,這個時候數(shù)字證書就起到作用了。李四到權威的數(shù)字證書機構申請數(shù)字證書,證書里面包含了公鑰(lisi2)和公鑰的擁有者(李四)等相關信息,然后李四將證書發(fā)給張三,張三通過證書里面的信息就可以知道公鑰到底是不是李四的了。
那證書在發(fā)送過程中有沒有可能被王五截獲并篡改呢?要知道證書里面還包含CA的數(shù)字簽名,這個簽名是證書機構用他們自己的私鑰對證書的摘要進行加密的,而公鑰是公開的。所以即便王五截獲并篡改了證書內容,他也無法偽造證書機構的簽名,張三在收到證書后通過驗證簽名也會發(fā)現(xiàn)證書被篡改了。所以到這一步才能保證數(shù)據傳輸?shù)恼嬲踩?/p>