hmac是一種使用單向雜湊函式來構造訊息認證碼的方法,其中hmac中的h就是hash的意思,以乙個金鑰和乙個訊息為輸入,生成乙個訊息摘要作為輸出。或者簡單點說,hmac就是資訊在hash的時候,按照一定規則在資訊裡新增了一些關鍵字,增加了hash破解的難度。
hmac中所使用的單向雜湊函式並不僅限於一種,任何高強度的單向雜湊函式都可以被用於hmac,如果將來設計出的新的單向雜湊函式,也同樣可以使用。
使用sha-1、sha-224、sha-256、sha-384、sha-512所構造的hmac,分別稱為hmac-sha1、hmac-sha-224、hmac-sha-384、hmac-sha-512。
(注:通過雜湊演算法,我們可以驗證一段資料是否有效,方法就是對比該資料的雜湊值,例如,判斷使用者口令是否正確,我們用儲存在資料庫中的password_md5對比計算md5(password)的結果,如果一致,使用者輸入的口令就是正確的。
為了防止黑客通過彩虹表根據雜湊值反推原始口令,在計算雜湊的時候,不能僅針對原始輸入計算,需要增加乙個salt來使得相同的輸入也能得到不同的雜湊,這樣,大大增加了黑客破解的難度。
如果salt是我們自己隨機生成的,通常我們計算md5時採用md5(message + salt)。但實際上,把salt看做乙個「口令」,加salt的雜湊就是:計算一段message的雜湊時,根據不通口令計算出不同的雜湊。要驗證雜湊值,必須同時提供正確的口令。
這實際上就是hmac演算法:keyed-hashing for message authentication。它通過乙個標準演算法,在計算雜湊的過程中,把key混入計算過程中。
和我們自定義的加salt演算法不同,hmac演算法針對所有雜湊演算法都通用,無論是md5還是sha-1。採用hmac替代我們自己的salt演算法,可以使程式演算法更標準化,也更安全。)
演算法公式 :
hmac(k,m)=h(k⊕opad∣h(k⊕ipad∣m))
h 代表所採用的hash演算法(如sha-256)
k 代表認證密碼
ko 代表hash演算法的密文
m 代表乙個訊息輸入
b 代表h中所處理的塊大小,這個大小是處理塊大小,而不是輸出hash的大小
如,sha-1和sha-256 b = 64
sha-384和sha-512 b = 128
l 表示hash的大小
opad是外部的填充常數(用0x5c重複b次)
ipad是內部的填充常數(用0x36重複b次)
apad 用0x878fe1f3重複(l/4)次
1 )金鑰填充
如果金鑰比單向雜湊函式分組長度要短,就需要在末尾填充0,直到其長度達到單向雜湊函式的分組長度為止。
如果金鑰比分組長度要長,則要用單向雜湊函式求出金鑰的雜湊值,然後將這個雜湊值用作hmac的金鑰。
2) 填充後的金鑰與ipad的xor
將填充後的金鑰與被稱為ipad的位元序列進行xor運算。ipad是將00110110這一位元序列不斷迴圈反覆直到達到分組長度所形成的位元序列,其中ipad的i是inner的意思。
xor運算所得到的值,就是乙個和單向雜湊函式的分組長度相同,且和金鑰相關的位元序列。這裡將這個位元序列稱為ipadkey。
3) 與訊息組合
4 )計算雜湊值
將3的結果輸入單向雜湊函式,並計算出雜湊值。
5 )填充後的金鑰與opad的xor
將填充後的金鑰與被稱為opad的位元序列進行xor運算,opad是將01011100這一位元序列不斷迴圈反覆直到達到分組長度所形成的位元序列,其中opad的o是outer的意思。
xor運算所得到的結果也是乙個和單向雜湊函式的分組長度相同,且和金鑰相關的位元序列。這裡將這個位元序列稱為opadkey。
6 )與雜湊值組合
將4的雜湊值拼在opadkey後面。
7 )計算雜湊值
將6的結果輸入單向雜湊函式,並計算出雜湊值,這個雜湊值就是最終的mac值。
通過上述流程可以看出,最後得到的mac值,一定是乙個和輸入的訊息以及金鑰都相關的長度固定的位元序列。
1)服務端生成key,傳給客戶端;
2)客戶端使用key將帳號和密碼做hmac,生成一串雜湊值,傳給服務端;
3)服務端使用key和資料庫中使用者和密碼做hmac計算雜湊值,比對來自客戶端的雜湊值。
hmac演算法更象是一種加密演算法,它引入了金鑰,其安全性已經不完全依賴於所使用的hash演算法
1. 使用的金鑰是雙方事先約定的,第三方不可能知道。能夠得到的資訊只有作為「挑戰」的隨機數和作為「響應」的hmac結果,無法根據這兩個資料推算出金鑰。由於不知道金鑰,所以無法仿造出一致的響應。
2. hmac與一般的加密重要的區別在於它具有「瞬時」性,即認證只在當時有效
訊息摘要演算法簡介
訊息摘要演算法簡介 一 什麼是訊息摘要演算法 訊息摘要演算法的主要特徵是加密過程不需要金鑰,並且經過加密的資料無法被解密,只有輸入相同的明文資料經過相同的訊息摘要演算法才能得到相同的密文。訊息摘要演算法不存在金鑰的管理與分發問題,適合於分布式網路相同上使用。由於其加密計算的工作量相當可觀,所以以前的...
Java 訊息摘要演算法
一 md5 因為在訊息摘要演算法中,md5應該最常用的,所以放在最前面。另外md家族中除了md5外,還有md2和md4,md2和md5在jdk中已經有實現,md4則是在bouncy castle有實現。public abstract class md5 catch nosuchalgorithmex...
訊息摘要演算法 數字摘要
為了保證檔案或值的安全性,因為使用訊息摘要生成的值是不可篡改的 特點 準備工作 string input 訊息摘要 string algorithm md5 public static void main string args throws exception 建立乙個訊息摘要物件messaged...