所有这一切对我来说都是新的,所以请原谅我的无聊问题。
我试图逐步找出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
现在我有点迷失了。我会按照我的理解写下这些步骤,如果我错了(或者我错了,请纠正我)。
ipad = 0x36(x64)
opad = 0x5c(x64)
ipad XOR key = ipad
opad XOR key = opad
所以:HMAC = Hash(opad || Hash(ipad || message))应该是它。
但我不知道如何执行此操作。 消息是文本字符串。 opad和ipad是uint / byte数组。我也可以将它们转换为ASCII并分别接收:
ipad_str =" 6666666666 ..." 64
opad_str =" \\\\\\\ ...." 64
现在我的HMAC应该是:
HMAC = SHA_1(" \\\\\\ ...." + SHA_1(" 6666666 ...."))
但结果并不匹配。相反,它是: 4DCF4B8D646EBD77EB704A9240BFA429078131A2
我在这里缺少什么?是否还必须填充空消息? 我怀疑我误解了连接,但我不确定我还有其他选择。我应该将ipad和opad留作十六进制吗? SHA1方法接收字符串,所以我必须转换为某种字符串,我只是无法弄清楚究竟是什么类型。
非常感谢任何帮助。 在此先感谢新年快乐!
答案 0 :(得分:1)
我的方法问题非常明显,甚至都不好笑。在附加opad和内部哈希的结果时,我将内部哈希以十六进制格式保留,但将其视为ASCII,因此将104个字节发送到外部哈希而不是84.因此解决方案类似于:HMAC = SHA_1( opad + HexToASCII(SHA_1(ipad)));