C# (windows app 8.1) HMAC SHA256 不同于其他语言(太短?)
C# (windows app 8.1) HMAC SHA256 differs from other languages (too short?)
我有一种方法可以在 Ruby 和 Objective-C 中使用 HMAC SHA256 生成校验和,我正在尝试将其移植到 C#。看起来 C# 实现正在创建一个太短的散列字符串:Ruby 版本:
message = "POSThttp://api.somewhere.com/eventsmy_data1423778684"
key = "ABC123"
checksum = Digest::HMAC.hexdigest(message, key, Digest::SHA256)
给出'83f47bcd10c7360614bb8a858786eb588be3494f1e9bf8a1769bd5f6fff0a3b8'
而 C# 版本
public string GetSHA256Key(string hashKey, string stringToSign)
{
MacAlgorithmProvider macAlgorithmProvider = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA256");
BinaryStringEncoding encoding = BinaryStringEncoding.Utf8;
var messageBuffer = CryptographicBuffer.ConvertStringToBinary(stringToSign, encoding);
IBuffer keyBuffer = CryptographicBuffer.ConvertStringToBinary(hashKey, encoding);
CryptographicKey hmacKey = macAlgorithmProvider.CreateKey(keyBuffer);
IBuffer signedMessage = CryptographicEngine.Sign(hmacKey, messageBuffer);
return CryptographicBuffer.EncodeToBase64String(signedMessage);
}
Returns 'g/R7zRDHNgYUu4qFh4brWIvjSU8em/ihdpvV9v/wo7g=' 相同 key/message.
此网站还 returns 与非 C# 实现相同的散列字符串 http://hash.online-convert.com/sha256-generator。
除了您 return HMAC 的 base64 编码版本之外,您的 C# 代码可以正常工作。
将 return 行更改为
return CryptographicBuffer.EncodeToHexString(signedMessage);
它应该return如您所愿。
我有一种方法可以在 Ruby 和 Objective-C 中使用 HMAC SHA256 生成校验和,我正在尝试将其移植到 C#。看起来 C# 实现正在创建一个太短的散列字符串:Ruby 版本:
message = "POSThttp://api.somewhere.com/eventsmy_data1423778684"
key = "ABC123"
checksum = Digest::HMAC.hexdigest(message, key, Digest::SHA256)
给出'83f47bcd10c7360614bb8a858786eb588be3494f1e9bf8a1769bd5f6fff0a3b8'
而 C# 版本
public string GetSHA256Key(string hashKey, string stringToSign)
{
MacAlgorithmProvider macAlgorithmProvider = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA256");
BinaryStringEncoding encoding = BinaryStringEncoding.Utf8;
var messageBuffer = CryptographicBuffer.ConvertStringToBinary(stringToSign, encoding);
IBuffer keyBuffer = CryptographicBuffer.ConvertStringToBinary(hashKey, encoding);
CryptographicKey hmacKey = macAlgorithmProvider.CreateKey(keyBuffer);
IBuffer signedMessage = CryptographicEngine.Sign(hmacKey, messageBuffer);
return CryptographicBuffer.EncodeToBase64String(signedMessage);
}
Returns 'g/R7zRDHNgYUu4qFh4brWIvjSU8em/ihdpvV9v/wo7g=' 相同 key/message.
此网站还 returns 与非 C# 实现相同的散列字符串 http://hash.online-convert.com/sha256-generator。
除了您 return HMAC 的 base64 编码版本之外,您的 C# 代码可以正常工作。
将 return 行更改为
return CryptographicBuffer.EncodeToHexString(signedMessage);
它应该return如您所愿。