所有这一切对我来说都是新事物,因此请原谅我的笨拙问题。
我正在尝试逐步找出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-key.Length);
每个64个字节长的两个常量是:
ipad = 0x36(x64)
opad = 0x5c(x64)
因为键为空字符串XOR导致opad和ipad相同,即
ipad XOR键= 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 ....”))
但结果不匹配。相反,它是:
4DCF4B8D646EBD77EB704A9240BFA429078131A2
我在这里想念什么?是否也必须填充空消息?
我怀疑我误解了串联,但是我不确定我还有其他选择。我应该将ipad和opad保留为十六进制吗? SHA1方法接收字符串,因此我必须转换为某种字符串,但我无法弄清楚到底是什么类型。
任何帮助将不胜感激。
在此先感谢您,新年快乐!
最佳答案
我的方法的问题是如此明显,甚至不好笑。在附加opad和内部哈希的结果时,我将内部哈希保留为十六进制格式,但将其视为ASCII,结果104个字节被发送到外部哈希而不是84个字节。所以解决方案类似于:HMAC = SHA_1( opad + HexToASCII(SHA_1(ipad)));