首先來看一段HmacSHA1加密和SHA1加密的代碼
#!/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')
輸出結果為
1db0e9132a8dff51e3a4d47497e29a500087da9a
b1c1d8736f20db3fb6c1c66bb1455ed43909f0d8
從結果中可以發現,HmacSHA1演算法和SHA1演算法都可以為任意長的訊息生成一個20位元組(160bit)的固定大小的輸出,那么他們的區別在哪兒呢?
其實答案是很簡單的,
在HMAC vs. raw SHA-1這篇文章中有一個有趣的解釋,翻譯過來大意如下
寫在前面,請不要在意具體的摘要計算結果,重點在于解釋的趣味性和簡潔明了
假設你想向你喜歡的人表白,你很想拿出一首美麗的14行詩,但是最后你決定只說一句簡單的
"i love you",你要表白的資訊能夠完好無損的傳達給喜歡的妹子,但是你又不想其他的人知道,那么可以了解一些關于密碼哈希的知識,使用SHA-1演算法從訊息中生成一個摘要,
"i love you"對應的SHA-1摘要是:bb7b1901d99e8b26bb91d2debdb7d7f24b3158cf你喜歡的妹子接收到訊息后,使用SHA-1演算法重新計算出摘要和你發送的摘要進行比較,如果匹配就表示訊息正確,
但是總有那么些刁民打算攔截你的資訊,然后用另一個訊息
"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加密的區別就很明顯了,希望大家也都能理解,
參考:
- HMAC vs. raw SHA-1
- 極客學院-hmac
- 極客學院-hashlib
記得幫我點贊哦!
精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你需要的學習資料,還在等什么?快去關注下載吧!!!

念念不忘,必有回響,小伙伴們幫我點個贊吧,非常感謝,
我是職場亮哥,YY高級軟體工程師、四年作業經驗,拒絕咸魚爭當龍頭的斜杠程式員,
聽我說,進步多,程式人生一把梭
如果有幸能幫到你,請幫我點個【贊】,給個關注,如果能順帶評論給個鼓勵,將不勝感激,
職場亮哥文章串列:更多文章

本人所有文章、回答都與著作權保護平臺有合作,著作權歸職場亮哥所有,未經授權,轉載必究!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/238441.html
標籤:訊息安全
上一篇:思索 p5.js 的最佳實踐
