HMAC产生错误的结果

本文关键字:结果 错误 HMAC | 更新日期: 2023-09-27 18:28:23

所有这些对我来说都是新的,所以请原谅我的提问。

我正试图一步一步地弄清楚HMAC。

假设我有以下SHA-1方法:

public static string SHA_1(string input) 
{
    SHA1CryptoServiceProvider mySha = new SHA1CryptoServiceProvider();
    string temp = BitConverter.ToString(mySha.ComputeHash(Encoding.UTF8.GetBytes(input)));
    temp = temp.Replace("-", "").ToUpper();
    return temp;
} 

它接收一个纯文本字符串;

假设我的密钥是"(空字符串),消息也是如此;HMAC应该是:fbdb1d1b18aa6c08324b7d64b71fb76370690e1d

现在我有点迷失了方向。我会记下我理解的步骤,如果我错了(或者我错在哪里),请纠正我。

  1. 如果密钥短于64字节,我需要用0来填充它。所以填充的密钥是0x00(x64-因为密钥是空的,否则它是64密钥长度)
  2. 每个64字节长的两个常量是:

ipad=0x36(x64)

opad=0x5c(x64)

  1. 因为密钥是空字符串XOR结果是相同的opad和ipad,即

ipad异或密钥=ipad

opad XOR密钥=opad

  1. 在这一点上,剩下的就是计算HMAC本身

所以:HMAC=Hash(opad||Hash(ipad||message)),应该就是这样。

但我不知道该如何执行。消息是一个文本字符串。opad和ipad是uint/byte数组。我也可以将它们转换为ASCII并分别接收:

ipad_str="6666666666…"x64

opad_str="''''''……"x64

现在我的HMAC应该是:

HMAC=SHA_1("…"+SHA_1("6666666…")

但是结果不匹配。相反,它是:4dcf4b8d646ebd77eb704a9240bfa29078131a2

我在这里错过了什么?空消息也必须填充吗?我怀疑我误解了串联,但我不确定我还有什么其他选择。我应该将ipad和opad保留为十六进制吗?SHA1方法接收字符串,所以我必须转换成某种字符串,我只是不知道确切的类型。

如有任何帮助,我们将不胜感激。提前感谢,新年快乐!

HMAC产生错误的结果

我的方法的问题非常明显,一点也不好笑。在附加opad和内部哈希的结果时,我将内部哈希保留为十六进制格式,但将其视为ASCII,因此向外部哈希发送了104个字节,而不是84个字节。因此,解决方案类似于:HMAC=SHA_1(opad+HexToASCII(SHA_1(ipad)));