我想知道是否有标准代码可以使用密钥生成 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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我找到的另一张
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;
}
Run Code Online (Sandbox Code Playgroud)
这两个生成的代码与http://www.freeformatter.com/hmac-generator.html#ad-output生成的代码不同
我将使用SHA256
我们的外部 API 之一,消费者可以在其中对数据进行哈希处理并将其发送给我们。所以我们只是想确保我们使用标准方法,以便他们向我们发送正确的哈希值。另外,我想知道是否有任何知名的金块。我还尝试使用 Bouncy Castle 寻找解决方案,但是,我找不到使用密钥进行哈希的解决方案。
差异是由于字符编码(示例中的 ASCII 与 UTF-8)造成的。请注意,散列算法采用字节数组,并且您事先将字符串转换为该字节数组。
您的问题“标准代码是什么”可能没有答案,我说如果您希望输入仅包含ASCII字符空间的内容,请选择该内容,如果不选择 UTF-8。无论哪种方式 - 将其传达给您的用户
如果您想从可用性的角度来看待它并使其最适合您的用户 - 两者兼而有之。以两种方式对内容进行哈希处理并再次检查用户传入的哈希值,但这完全取决于您对时钟周期、安全性与可用性的评估(您可以有两个)