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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top