在C#中检查没有密钥的HMAC-SHA1

时间:2014-11-27 07:19:11

标签: c# salt hmacsha1

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

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

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

2 个答案:

答案 0 :(得分:3)

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

  

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

只需添加一些常量键,每次都会获得相同的哈希值。 e.g。

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

回答你的问题:

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

答案 1 :(得分:2)

来自HMACSHA1的文档:

  

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

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

如果使用相同的密钥散列相同的数据,则应获得与结果相同的散列。

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

string base64Hmac = Convert.ToBase64String(hmac);