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),其中编码文本将用作消息?

谢谢你

4

1 回答 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))。

  • blocksized 由您的哈希函数确定(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
于 2012-07-10T14:35:30.117 回答