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如您所愿。