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
现在我有点迷失了方向。我会记下我理解的步骤,如果我错了(或者我错在哪里),请纠正我。
- 如果密钥短于64字节,我需要用0来填充它。所以填充的密钥是0x00(x64-因为密钥是空的,否则它是64密钥长度)
- 每个64字节长的两个常量是:
ipad=0x36(x64)
opad=0x5c(x64)
- 因为密钥是空字符串XOR结果是相同的opad和ipad,即
ipad异或密钥=ipad
opad XOR密钥=opad
- 在这一点上,剩下的就是计算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方法接收字符串,所以我必须转换成某种字符串,我只是不知道确切的类型。
如有任何帮助,我们将不胜感激。提前感谢,新年快乐!
我的方法的问题非常明显,一点也不好笑。在附加opad和内部哈希的结果时,我将内部哈希保留为十六进制格式,但将其视为ASCII,因此向外部哈希发送了104个字节,而不是84个字节。因此,解决方案类似于:HMAC=SHA_1(opad+HexToASCII(SHA_1(ipad)));