hash和簽名 、證書


一、加解密算法(最普通的加解密)

對稱密鑰:用戶A將明文信息M使用密鑰K進行加密,用戶B是用密鑰K將加密后的信息進行解密。(加密與解密使用同一密鑰K)

非對稱密鑰:用戶A將明文信息使用密鑰SK進行加密,用戶B使用密鑰PK將加密后的信息進行解密。(加密與解密使用不同的密鑰SK與PK,且SK與PK互為配對)

 

二、簽名、驗簽算法(如何驗證簽名的真偽)

用戶A使用私鑰SK進行簽名得到數字簽名,用戶B得到數字簽名與明文信息后,再使用公鑰PK對數字簽名進行驗簽,得到的結果與明文信息一致的話,則證明簽名正確,反之則簽名不正確。

 

三、數字簽名算法(如何驗證接收到的文檔是完整的未經篡改的)

加密過程:用戶A將文檔壓縮后,取得信息摘要,將信息摘要使用用戶A的私鑰進行加密,連同文檔與加密后的信息摘要發送給用戶B。

解密過程:用戶B收到文檔與加密后的信息摘要之后,使用用戶A的公鑰將加密的信息摘要進行解密,得到未加密的信息摘要,再將文檔進行壓縮,取得文檔的信息摘要,如果兩個信息摘要是一致的,則該文檔的完整性是可以保證的。

 

四、哈希算法

將信息M經過哈希運算后得到一串固定長度的哈希值s(s具有單向性,即給定M可輕易推算出s,但給定s卻很難反推出M)
給定M,如果想要找到另一個明文信息m,並且這個明文信息m經過哈希運算后很難得到s
所以哈希算法就相當於賦予信息M一個“指紋”也稱為“摘要”

 

五、數字證書

數字證書是通過一個大家都認可信任的權威機構——CA進行頒發的

當用戶A與用戶B(用戶A為私鑰所有者)通信時:
雖然私鑰為用戶A所獨有,但是公鑰卻是相當於公有的,因此單單一個公鑰不足以驗證用戶B的身份,因此用戶B需要將用戶A的公鑰與自己的“電子身份證”發送給CA,由CA進行邦定並且“蓋章”后形成一張數字證書頒發給用戶B,用戶B再使用數字證書與用戶A進行通信,用戶A在檢測到用戶B的數字證書上存在CA的標識后,認定了用戶B的合法性,則通信成功!

 

hash 

 

可能以前的文章講得不夠簡單,hash算法其實就是將一段非常長的數據通過hash變換為一個固定長度相對較短的數據,簡稱“摘要”,你可以理解成把一本書通過hash變成一段很短的話,算法最關鍵的要點是,哪怕你改動了這本書里面的一個標點符號,hash后的摘要都會改變。(累死我了,我發現說大白話講技術問題挺難的)

 

以MD5這種hash算法為例,他可以將任意長度的數據變成128位的散列值,所謂任意長度的意思就是你的數據可以是一篇文章,一部電影,或者只是一個字母,哪怕是個空字符串,下面這個就是MD5一個空字符串后的值:

 

MD5("")= d41d8cd98f00b204e9800998ecf8427e

 

這個例子只是說明hash可以將任意長度的數據變為一個固定長度的值,算法的精妙在於這個值對於不同的數據還是不一樣的,如果不同的數據生成的hash值一樣,就是有名的“hash碰撞了”

 

其實hash適合於比較大的數據做摘要,不能作為加密使用,很多誤傳為MD5加密,也有人稱之為單向加密,就是指不能通過hash后的值不能推導原來的數據,這種說法不夠嚴密,比如很多網站喜歡將用戶的密碼經過MD5變換后存儲,主要防止數據庫泄露后直接查看用戶的密碼,真正密碼比對時對用戶輸入的密碼進行md5變換然后和存儲的md5值比較

 

從密碼學上講加密過程都要對應解密過程,即可以通過密文還原明文,所以以上的密碼保護方法不是嚴格意義上的數據加密解密。

 

對於以上方法,一般采用md5字典進行暴力解密,只需要對原有的密碼字典進行MD5變換,然后進行字典比對,不會增加太多的計算復雜度,比如你看到d41d8cd98f00b204e9800998ecf8427e這個值就知道代表的是一個空字符串。

 

不對稱加密 

 

所謂不對稱加密,是對於對稱加密而言的,傳統的對稱加密只有一個秘鑰(你可以理解為密碼),你用這個秘鑰加密,別人也用這個秘鑰解密,這里面有個弊端就是,你把解密的密碼告訴別人時,比如發短信、發微信,這時候回受到中間人攻擊,簡單舉例說就是運營商等會看到你發的密碼,然后你們之間的通訊數據就被解開。

 

后來英國人搞出來不對稱加密,它包含兩個成對的密鑰,這里面有個概念一定要搞清楚,這個兩個成對的秘鑰是同時生成的,數學上存在一定關系,並沒有嚴格意義上的哪一個必須是公鑰,哪一個必須是私鑰,你公布出去的那個就是公鑰,你保留的那個就是私鑰,看你高興。

 

需要注意的時,不同的算法在設計時,為了保障效率公鑰會采用固定值生成,比如RSA算法建議公鑰的運算e1取值為3或65537(從理論上說迭代猜中的幾率更大),所以在實際應用中最好按照推薦選擇保留自己的私鑰

 

另外一個概念來了,這是很多人對於后期數字簽名比較容易搞蒙圈的地方,首先我們要知道對於不對稱加密一個重要特點就是:公鑰加密的數據私鑰可以解密,私鑰加密的數據公鑰可以解密,記住這句話后面的數字簽名原理你就能搞清楚。

 

數字簽名 

 

前面講了不對稱加密,現在你有了一個可以公布出去的公鑰的,公鑰的作用就是公布出去,如果對方想給你發信息,他就可以可以用你的公鑰進行數據加密然后發給你,你用你的私鑰解密數據,即便是中間人截獲你的公鑰也沒用。如果你想給對方發加密信息,那么就反過來需要知道對方的公鑰即可。所以不對稱加密最重要的就是保護你的私鑰,這就是我們常說的使用不對稱算法進行加密數據傳輸。

 

那么數字簽名又是什么呢,其實也很簡單了,大白話來講也是一個加密解密過程,就是將數據用你的私鑰進行加密,然后把明文和密文都發給對方,對方用你的公鑰對密文進行解密,然后比對解密后的明文是不是一樣,這樣就證明這個數據沒有被第三方篡改,的確是你書寫的

 

現在hash算法的重要性要出來了,如果你發送的數據非常短,比如“我愛你”“我恨你”這些很短的句子,你是用不到hash算法的,你只需要用你私鑰加密這些短句,然后把  “我愛你”連同加密后的數據比如"@#@#%",一起發過去,對方用你的公鑰解開一看果然是“我愛你”,證明沒有被篡改,如果解開一看是“我恨你”,就說明在傳輸過程被中間人篡改了。

 

如果你發的是一大段文字,比如萬字情書什么的,你也可以使用剛才的方法進行簽名,那么你就要發送很長一段的密文和明文給對方驗證,這明顯是浪費資源的。

 

第一節說過,你終於可以使用hash算法,hash算法就是可以把很長的數據摘要成很短的一段數據,比如采用MD5后只有128位,現在你就可以使用MD5摘要你的萬字情書了,得到一個128位的摘要,然后你使用你的私鑰對這個128摘要進行加密,這個過程就叫做數字簽名,所以數字簽名是兩個過程,先對數據進行hash摘要,然后對摘要進行私鑰加密。

 

然后你只需要把你的情書和私鑰加密后的摘要發給對方就行了,這明顯減少了傳輸量,也讓簽名變得專業了(呵呵)。對方收到你的情書和加密摘要后,只需要對情書同樣進行一次hash運算,得到一個128位數據,然后用你的公鑰解密你發過來的摘要,如果這兩個數據一樣就證明這篇情書里面一個標點符號都沒有改變,如果不一樣,就證明數據在傳輸過程中被人篡改過,不是你所寫,這個過程就叫做驗證簽名。

 

現在你明白hash算法的重要性了吧,簡而言之,如果hash算法被攻破,中間人可以篡改你的數據,並保證篡改過的數據有一樣的hash值,那么數字簽名的基石就被動搖了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM