iT邦幫忙

0

HMAC-SHA256是一種hash方法嗎?

在做jwt實作時會遇到選擇hs256或rs256。
我知道sha256是一種hash的演算法,那hmac+sha256又是什麼?
文章說hmac是對稱金鑰,rsa是不對稱的金鑰,代表hmac+hs256是用hmac這演算法對經過sha256後的結果上鑰匙嗎?

JWT.IO

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

若按照這個式子來看,就是先把base64UrlEncode(header) + "." + base64UrlEncode(payload)用hash256去hash,再用hmac鎖上的意思?而鑰匙是secret?

很多hmac線上網頁都是hmac+很多hash方法可以選擇,有點被搞混,hmac不能單用嗎?一定要配一個hash演算法?

2 個回答

4
froce
iT邦大師 1 級 ‧ 2020-06-12 11:13:27
最佳解答

https://www.biaodianfu.com/hmac.html
這篇其實寫得很詳細了,我粗略介紹一下。

1.因為hash算出來的結果都一樣,所以攻擊方可以使用彩虹表推算出來。
2.因此開發出加鹽,也就是多加入隨機值下去算hash。
3.加鹽的方法可以自己設定,但是加鹽如果太簡單還是有可能被猜出,因此發展出一套標準方法來做加鹽,也就是HMAC。

回到你的問題:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
  
 # 你可以把這句看成這樣的一個函數
 HMACSHA256(加密內容, 密鑰)

1.HMAC需要一個密鑰,在這裡就是secret,這是藏在server裡的。
2.HMAC需要搭配hash方法。

wrxue iT邦新手 2 級 ‧ 2020-06-12 22:48:01 檢舉

你所提供的文章中提到這個式子,

HMAC (k,m) = H ( (k XOR opad ) + H( (k XORipad ) + m ) )

請問那個H(Hash函数)在HMAC-SHA256裡就是SHA256嗎

froce iT邦大師 1 級 ‧ 2020-06-14 09:39:36 檢舉

1
japhenchen
iT邦高手 1 級 ‧ 2020-06-12 12:35:28

這也只是用來做密碼加密用的,當你的資料庫太脆弱被盜取用戶帳密資料表,表裡有個人的密碼欄位內容是
5994471ABB01112AFCC18159F6CC74B4F511B99806DA59B3CAF5A9C173CACFC5
所謂的彩虹表,就是把所有可能的英文數字排列+字典+常用蠢蛋密碼,做成一個資料表
明碼12345
HASH值是 5994471ABB01112AFCC18159F6CC74B4F511B99806DA59B3CAF5A9C173CACFC5
一對一一筆一筆生成,那破壞者就能用簡單的方法查到這個人用的密碼,就是12345

那加鹽.....就是網站伺服器端在新建/修改用戶,在存進這密碼前,加上一個SECRET字串,只有主機方知道,不會被外流也不會被駭的地方存放這個字串值...
如 "12345"+"ABCDEFGHIJKLMNOPQRSTUVWXXYY"
SHA256之後的值就是 9D6F68B9C034ECAC34C5511CACF2C9FB669BBF1003E086A4678B59C0263C1302

誰家的彩虹表放的硬碟有那麼大可以存到這種字串的,自己站出來
英文26個字母(不分大小寫),數字10個,一共36個字,如果要存10個字的彩虹表,至少要有
36的10次方=3,656,158,440,062,976筆記錄,一筆50個BYTES好了,少說也是18萬TB(180EB)才有辦法存放....

這投資,真大

wrxue iT邦新手 2 級 ‧ 2020-06-12 22:49:23 檢舉

請問所謂的HMAC裡的金鑰就是那個鹽值嗎?

簡單理解就是程式設計員在加密前加入的一串字串,私有金鑰,讓HASH的複雜度加大,就算你想自建彩虹表,也要花一大筆投資

(重點支援這麼大的表的資料庫........我沒看過)

我要發表回答

立即登入回答