首先來看一段HmacSHA1加密和SHA1加密的代碼html
#!/usr/bin/env python # -*- coding: utf-8 -*- """ Created on 1/31/18 10:03 AM @author: Chen Liang @function: HmacSHA1 vs SHA1 """ import sys reload(sys) sys.setdefaultencoding('utf-8') import hashlib import hmac def sha1(msg): """ sha1加密 :param msg: :return: 長度40位的摘要信息 """ sha = hashlib.sha1() sha.update(msg) return sha.hexdigest() def hmac_sha1(key, msg): """ hmac sha1加密 :param key: 密鑰 :param msg: 待加密消息 :return: 長度40位的摘要信息 """ m = hmac.new(key, msg, hashlib.sha1) return m.hexdigest() print hmac_sha1('FKEwTiz9Te0FWlqkS4g8hEdqAsPZfdR4', 'me') print sha1('me')
輸出結果爲python
1db0e9132a8dff51e3a4d47497e29a500087da9a b1c1d8736f20db3fb6c1c66bb1455ed43909f0d8
從結果中能夠發現,HmacSHA1算法和SHA1算法均可覺得任意長的消息生成一個20字節(160bit)的固定大小的輸出,那麼他們的區別在哪兒呢?程序員
其實答案是很簡單的。算法
在HMAC vs. raw SHA-1這篇文章中有一個有趣的解釋,翻譯過來大意以下併發
寫在前面,請不要在乎具體的摘要計算結果,重點在於解釋的趣味性和簡潔明瞭ide
假設你想向你喜歡的人表白,你很想拿出一首美麗的14行詩,可是最後你決定只說一句簡單的
"i love you"
。學習你要表白的信息可以無缺無損的傳達給喜歡的妹子,可是你又不想其餘的人知道,那麼能夠了解一些關於密碼哈希的知識,使用SHA-1算法從消息中生成一個摘要。ui
"i love you"
對應的SHA-1摘要是:bb7b1901d99e8b26bb91d2debdb7d7f24b3158cf
加密你喜歡的妹子接收到消息後,使用SHA-1算法從新計算出摘要和你發送的摘要進行比較。若是匹配就表示消息正確。.net
可是總有那麼些刁民打算攔截你的信息,而後用另外一個消息
"don't call me anymore"
替代掉,而後生成一個全新的摘要:e267e18f05cb6ea3b10b761bbac21a0f92bb8d0d
。你喜歡的妹子收到消息以後摘要信息沒法匹配得上,都有些難以置信了。事情看起來很嚴峻,可是你向妹子解釋了一番,保證之後不再會發生這樣相似的事情,你和妹子約定在計算hash摘要信息時在消息前面加上文本
"our secret key."
,也就是新的完整的信息是"our secret key.i love you"
。就這樣相同的消息就會產生下面這樣的摘要信息:
e0759e9b59bdd6d864d29ce3a502adb6257f7615
, 原文的這個值計算有錯,評論中有提出。這時候若是那些刁民只是簡單的替換摘要信息就不生效了。由於你妹子使用key+msg的方式獲得的結果和替換以後的摘要信息匹配不上。這樣只要別人不知道你的密鑰就沒有辦法產生虛假的消息。
可是還有一個問題,問題在於SHA-1和HMAC之間的區別。
SHA-1是使用迭代算法進行計算的,首先一個接一個地將消息分紅64個字節的塊,而後把這些塊組合在一塊兒來產生20個字節的摘要信息。 可是,因爲你的消息能夠是任意長度的,而且因爲SHA經過其迭代性質在64字節的塊以後繼續計算塊,這時候問題就出現了。
那些刁民打算再次改變你的信息,他們可能只是將更多的數據添加你的消息裏面,因爲你的密鑰在前面的塊中已經通過了計算,這時候添加在後面的消息不會受到你的密鑰影響。
若是在消息後面簡單的添加上"but please don't call me anymore",計算新的摘要併發送給你喜歡的妹子,妹子會覺得整段消息就是你的意思。(此處具體計算方法須要參照sha1算法的實現)
就這樣一個大寫的GG刻在了你的臉上(欲哭無淚)!!!
可是也不用慌,咱們還有HMAC,HMAC解決了這個問題,HMAC在整個hash過程當中能有效的密封消息隱藏密鑰,而且不能在尾部追加數據。具體的解決辦法參見HMAC的實現。
根據維基百科,沒有發現任何已知的HMAC消息擴展攻擊。
恭喜你,妹子到手了,請開始你的性福之旅吧(啊呸,傻逼輸入法,是幸福)!!!
到這裏其實HmacSHA1加密和SHA1加密的區別就很明顯了,但願你們也都能理解。
參考:
記得幫我點贊哦!
精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你須要的學習資料,還在等什麼?快去關注下載吧!!!
念念不忘,必有迴響,小夥伴們幫我點個贊吧,很是感謝。
我是職場亮哥,YY高級軟件工程師、四年工做經驗,拒絕鹹魚爭當龍頭的斜槓程序員。
聽我說,進步多,程序人生一把梭
若是有幸能幫到你,請幫我點個【贊】,給個關注,若是能順帶評論給個鼓勵,將不勝感激。
職場亮哥文章列表:更多文章
本人全部文章、回答都與版權保護平臺有合做,著做權歸職場亮哥全部,未經受權,轉載必究!