为什么ComputeHash不确定性地行动?
-
02-10-2019 - |
题
我遇到了一个有趣的问题。似乎“ hmacsha256”哈希的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)
并通过该方法中的断点返回两个不同的哈希。
我知道哈希应该是确定性的。在调试器中跑步时发生了什么事吗?还是其他想法?真的,这只是两个现在的单词怪异:p ..
谢谢乔什
解决方案
HMAC是一个钥匙哈希。我看不到您的示例代码中的密钥。
HashAlgorithm.Create("HMACSHA256")
创建Hashalgorithm实例,因此对密钥一无所知。它可能只是打电话 此HMACSHA256构造函数:
public HMACSHA256()
初始化HMACSHA256类的新实例 随机生成的密钥.
你要 这个构造函数:
public HMACSHA256(byte[] key)
用指定的密钥数据初始化HMACSHA256类的新实例。
如果您不想硬编码HMAC算法,则可以使用 Keyedhashalgorithm.创建 并通过设置特定键 Keyedhashalgorithm.key 财产。
如果您不想使用钥匙,请使用像SHA256这样的非钥匙哈希。
其他提示
只是为了保存我经历的头痛,只是为了挽救某人。
如果是 .NET会员提供者, ,请确保您在web.config或app.config中具有设置。否则,它将自动生成自己的钥匙...关于身份验证的废话,然后最后嘲笑您。
您需要HMACSHA256的钥匙。如果密钥未传递到构造函数,则将是随机的。
不隶属于 StackOverflow