C#(windows app 8.1)HMAC SHA256与其他语言不同(太短了吗?)

时间:2015-02-13 19:28:53

标签: c# windows-phone-8 win-universal-app

我有一个方法,在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);
        }

对于相同的密钥/消息,返回'g / R7zRDHNgYUu4qFh4brWIvjSU8em / ihdpvV9v / wo7g ='。

此网站还返回与非C#实现http://hash.online-convert.com/sha256-generator相同的散列字符串。

1 个答案:

答案 0 :(得分:2)

您的C#代码按预期工作,但您返回HMAC的base64编码版本。

将返回行更改为

return CryptographicBuffer.EncodeToHexString(signedMessage);

它应该返回你所期望的。