如何使用HMAC SHA256?

9
根据我读过的有关使用HMAC SHA256的各种文档,我理解如下:
H(K XOR opad, H(K XOR ipad, text)),其中在我的情况下,H是SHA256。
但是,SHA256输入只有一个参数,即消息。 而H(K,text)有两个输入。 那么如何计算H(k,text)?
我应该先用k对文本进行编码,然后使用H(encoded_text),其中encoded_text将用作消息吗?
谢谢!

你提出的操作是有效的,但是代价很高。像 H(H(M).K) 这样做会更容易,其中 H() 表示哈希操作,.表示追加,M和K分别表示消息和密钥。 - Wug
1
H()没有两个分隔符,你的“,”应该是||(连接符),请参考我下面的答案示例。 - Timmetje
1个回答

15
  • H() 是你的密码散列函数,在这种情况下是 SHA256(),但也可以是 MD5 或其他;
  • K 是预定义的密钥
  • Text 是要进行身份验证的消息
  • opad 是外部填充(0x5c5c5c…5c5c,一个块长的十六进制常量)
  • ipad 是内部填充(0x363636…3636,一个块长的十六进制常量)
  • 然后HMAC(K,m)根据如下数学定义:

HMAC(K,m) = H((K ⊕ opad) ∥ H((K ⊕ ipad) ∥ m))。

  • blocksize 由散列函数确定(MD5 将是 64 字节)
  • o_key_pad = [opad * blocksize] ⊕ key
  • i_key_pad = [ipad * blocksize] ⊕ key

你的结果将会是:

H(o_key_pad || H(i_key_pad || TEXT))

你可以在这里找到一篇好的阅读材料: http://timdinh.nl/index.php/hmac/

同时,还有以下伪代码,看起来几乎和我的一样:

function hmac (key, message)
    opad = [0x5c * blocksize] // Where blocksize is that of the underlying hash function
    ipad = [0x36 * blocksize]

    if (length(key) > blocksize) then
        key = hash(key) // Where 'hash' is the underlying hash function
    end if

    for i from 0 to length(key) - 1 step 1
        ipad[i] = ipad[i] XOR key[i]
        opad[i] = opad[i] XOR key[i]
    end for

    return hash(opad || hash(ipad || message)) // Where || is concatenation
end function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接