HMAC产生错误的结果

时间:2015-12-30 04:22:51

标签: c# sha hmac hmacsha1

所有这一切对我来说都是新的,所以请原谅我的无聊问题。

我试图逐步找出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' s填充它。 所以填充键是0x00(x64 - 因为键是空的,否则它是64键.Length);
  2. 每个64字节长的两个常量是:
  3. ipad = 0x36(x64)

    opad = 0x5c(x64)

    1. 因为密钥是空的字符串XOR导致相同的opad和ipad,即
    2. ipad XOR key = ipad

      opad XOR key = opad

      1. 此时剩下要做的就是计算HMAC本身。
      2. 所以: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方法接收字符串,所以我必须转换为某种字符串,我只是无法弄清楚究竟是什么类型。

        非常感谢任何帮助。 在此先感谢新年快乐!

1 个答案:

答案 0 :(得分:1)

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