趣談HmacSHA1和原生SHA1的區別

首先來看一段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加密的區別就很明顯了,但願你們也都能理解。


參考:

  1. HMAC vs. raw SHA-1
  2. 極客學院-hmac
  3. 極客學院-hashlib

記得幫我點贊哦!

精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你須要的學習資料,還在等什麼?快去關注下載吧!!!

resource-introduce

念念不忘,必有迴響,小夥伴們幫我點個贊吧,很是感謝。

我是職場亮哥,YY高級軟件工程師、四年工做經驗,拒絕鹹魚爭當龍頭的斜槓程序員。

聽我說,進步多,程序人生一把梭

若是有幸能幫到你,請幫我點個【贊】,給個關注,若是能順帶評論給個鼓勵,將不勝感激。

職場亮哥文章列表:更多文章

wechat-platform-guide-attention

本人全部文章、回答都與版權保護平臺有合做,著做權歸職場亮哥全部,未經受權,轉載必究!

相關文章
相關標籤/搜索