在 C# 中检查不带键的 HMAC-SHA1

本文关键字:HMAC-SHA1 检查 | 更新日期: 2023-09-27 18:32:15

我在 C# 中生成没有键的 HMAC-SHA1,每次它都会为相同的值返回不同的哈希,如何匹配哈希,

我的代码 https://dotnetfiddle.net/3a3tiP

  • 是否有可能匹配这些哈希值?
  • 我认为没有钥匙就不可能 HMAC-SHA1 我说得对吗?
  • 如果高于"是",那么为什么 C# 允许在没有键的情况下生成,它是如何工作的?

在 C# 中检查不带键的 HMAC-SHA1

是的

,因为您正在使用无参数构造函数来构建HMACSHA1实例,并且 MSDN 说

HMACSHA1() - 使用随机生成的密钥初始化 HMACSHA1 类的新实例。

只需添加一些常量键,您每次都会得到相同的哈希值。

var hmacSha = new HMACSHA1(Encoding.UTF8.GetBytes("yourConstantKey"));

并回答您的问题:

  1. 是的,2 代使用相同的密钥。
  2. 是的。
  3. 它为您生成随机密钥

来自HMACSHA1的文档:

基于哈希的消息身份验证代码 (HMAC) 可用于确定通过不安全通道发送的消息是否已被篡改,前提是发送方和接收方共享密钥。

所以是的,你需要一把钥匙。如果您没有指定密钥,则会为您生成一个密钥,之后您可以使用 Key 属性获取它(例如存储它)。或者,可以在构造函数中指定它,或设置 Key 属性,因为您是从另一方收到的,或者因为您想要重用以前生成的键。

如果使用相同的密钥对相同的数据进行哈希处理,则应获得相同的哈希值。

如注释中所述,您不应该使用 Encoding.GetString 将 HMAC 转换为字符串,因为它是任意二进制数据 - 它不是编码文本。最简单的方法可能是改用 base64:

string base64Hmac = Convert.ToBase64String(hmac);