【问题标题】:Check HMAC-SHA1 without key in C#在 C# 中检查没有密钥的 HMAC-SHA1
【发布时间】:2015-01-25 17:20:54
【问题描述】:

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

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

  • 是否可以匹配这些哈希?
  • 我认为 HMAC-SHA1 没有密钥是不可能的,对吗?
  • 如果上面是“是”,那么为什么 C# 允许在没有密钥的情况下生成,它是怎么做的?

【问题讨论】:

  • 除此之外,您应该使用Encoding.UTF8.GetString(hmac) 将散列转换为字符串。它不是 UTF-8 编码的字符串。使用 base64 或十六进制。

标签: c# salt hmacsha1


【解决方案1】:

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

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

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

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

并回答您的问题:

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

【讨论】:

    【解决方案2】:

    来自HMACSHA1的文档:

    如果发送者和接收者共享一个密钥,则可以使用基于哈希的消息验证码 (HMAC) 来确定通过不安全通道发送的消息是否已被篡改。

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

    如果您使用相同的键对相同的数据进行哈希处理,您应该得到相同的哈希结果。

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

    string base64Hmac = Convert.ToBase64String(hmac);
    

    【讨论】:

      猜你喜欢
      • 2015-08-03
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      相关资源
      最近更新 更多