12

我遇到了一个有趣的问题..似乎“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));
    }
}

我还尝试使调用非静态(实际上它开始时是非静态的,并且我有双重、三重和四重检查我的输入数组..每次通话都完全相同..我什至在 immidiate像这样的窗口:

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

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

我知道哈希应该是确定性的.. 那么给出了什么?在调试器中运行有什么问题吗?还是有其他想法?真的,现在这只是两个奇怪的词:-P ..

谢谢乔什

4

3 回答 3

24

HMAC 是一个键控散列。我在您的示例代码中看不到密钥。

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

public HMACSHA256()

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

你想要这个构造函数

public HMACSHA256(byte[] key)

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

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

如果您不想使用密钥,请使用非密钥哈希,例如 SHA256。

于 2010-07-06T13:27:42.877 回答
5

只是添加这一点,希望能拯救我所经历的头痛。

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

于 2010-10-11T18:13:50.970 回答
3

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

于 2010-07-06T13:28:43.590 回答