2017-05-05 23 views
2

我想知道是否有标准代码使用密钥生成SHA256哈希。我遇到了几种类型的代码,但是它们不会生成相同的输出。什么是使用C#生成HMAC SHA256的密钥的标准代码是什么?

代码发现在JokeCamp

private string CreateToken(string message, string secret) 
{ 
    secret = secret ?? ""; 
    var encoding = new System.Text.ASCIIEncoding(); 
    byte[] keyByte = encoding.GetBytes(secret); 
    byte[] messageBytes = encoding.GetBytes(message); 
    using (var hmacsha256 = new HMACSHA256(keyByte)) 
    { 
    byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); 
    return Convert.ToBase64String(hashmessage); 
    } 
} 

这里是另外一个,我发现

private static string ComputeHash(string apiKey, string message) 
{ 
    var key = Encoding.UTF8.GetBytes(apiKey); 
    string hashString; 
    using (var hmac = new HMACSHA256(key)) 
    { 
     var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message)); 
     hashString = Convert.ToBase64String(hash); 
    } 

    return hashString; 
} 

由这两个生成的代码是会产生什么不同的http://www.freeformatter.com/hmac-generator.html#ad-output

我会将SHA256用于我们的外部API之一,其中消费者将散列数据并将其发送给我们。所以我们只是想确保我们使用标准方法,以便他们发送正确的散列。另外,我想知道是否有这方面的知名人士。我也试图找到Bouncy Castle的解决方案,但是,我找不到使用密钥哈希的方案。

回答

2

区别在于字符编码(在您的示例中为ASCII与UTF-8)。请注意,散列算法需要一个字节数组,并且您事先将字符串转换为该字节数组。

你的问题“什么标准代码”可能处理不当的答案,身份证说,如果预计输入含有只是 ASCII字符空间的内容,去,如果不去为UTF-8。无论哪种方式 - 将它传达给你的用户

如果你想从可用性的角度来看待它,并使其成为用户的最佳选择 - 两者兼而有之。这两种方式散列内容并再次检查用户入站散列,但这一切都取决于您对时钟周期与安全vs可用性的评估(可以有两个)

0

它们几乎是等效的。

区别在于字符串的编码是如何建立的。

在代码的第一部分中,它采用ASCII,而在第二部分中它假定为UTF-8。字符串可能会使用另一种编码,而不是这些编码。

但无论如何,这个想法是要明白这个操作的目标是什么。在此背景下,真正相关的事情是:

  1. 给予平等的输入,输出应该是相同的
  2. 应该没有办法只有通过了解输出(在合理的时间量内)来检索明文
  3. 散列之后,您不再需要纯文本的原始输入。

安全的加密散列函数(意味着不像MD5这样的旧函数)可以实现这一点。

然后,如果存储散列的数据存储受到危害,攻击者将只拥有一个无法用于检索原始明文的散列。这就是为什么使用散列而不是加密的原因,加密是一种可逆操作(通过解密)。

然后,在系统内部,如果您决定使用一种编码,则需要在系统中的所有组件之间保持一致,以便它们可以互操作。