为什么ComputeHash没有确定性地行动?

时间:2010-07-06 13:14:20

标签: c# .net hmac hashalgorithm

我遇到了一个有趣的问题..似乎用于“HMACSHA256”散列的ComputeHash()在确定性方面没有表现...如果我使用HashAlgorithm.Create(“HMACSHA256”)创建两个HashAlgorithm实例。运行ComputeHash,我得到两个不同的结果..下面是一个展示这种行为的示例静态类。

internal static string HashPassword(byte[] bAll)
{
    using (HashAlgorithm s = HashAlgorithm.Create("HMACSHA256"))
    {
        return Convert.ToBase64String(s.ComputeHash(bAll));
    }
}

我也尝试过非静态调用(实际上它是非静态启动的,我有双重和三重四重扫描检查我的输入数组..每次调用它都完全相同..我甚至做过东西在像下面这样的候选窗口中:

Convert.ToBase64String(HashAlgorithm.Create("HMACSHA256").ComputeHash(bAll)

通过方法中的断点在immidiates窗口中运行两次会返回两个不同的哈希值。

我知道哈希被认为是确定性的。那么是什么给出了?在调试器中运行是怎么回事?还是其他任何想法?真的,现在这只是两个奇怪的词:-P ..

由于 约什

3 个答案:

答案 0 :(得分:24)

HMAC是一个键控哈希。我没有在示例代码中看到密钥。

HashAlgorithm.Create("HMACSHA256")创建一个HashAlgorithm实例,因此它对密钥一无所知。它可能只是调用this HMACSHA256 Constructor

  

public HMACSHA256()

     

使用 随机生成的密钥 初始化HMACSHA256类的新实例。

您想要this constructor

  

public HMACSHA256(byte[] key)

     

使用指定的密钥数据初始化HMACSHA256类的新实例。

如果您不想对HMAC算法进行硬编码,可以使用KeyedHashAlgorithm.Create并通过设置KeyedHashAlgorithm.Key属性来提供特定密钥。

如果您不想使用密钥,请使用SHA256之类的非键控哈希值。

答案 1 :(得分:5)

只是添加到这个,希望能够拯救某些人,让我感到头疼。

如果是 .Net Membership Provider ,请确保您在web.config或app.config中有设置。否则它会自动生成自己的密钥......认证失败,然后最后好战地嘲笑你。

答案 2 :(得分:3)

您需要HMACSHA256的钥匙。如果未将密钥传递给构造函数,则密钥将是随机的。