我遇到了一个有趣的问题..似乎用于“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 ..
由于 约什
答案 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的钥匙。如果未将密钥传递给构造函数,则密钥将是随机的。