在Javascript中创建C#生成的HMAC哈希

时间:2015-02-25 20:14:11

标签: javascript c# sha hmacsha1

我下面有C#功能;

private string GetEncyptionData(string encryptionKey)
    {
        string hashString = string.Format("{{timestamp:{0},client_id:{1}}}", Timestamp, ClientId);
        HMAC hmac = HMAC.Create();
        hmac.Key = Guid.Parse(encryptionKey).ToByteArray();
        byte[] hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(hashString));
        string encData = Convert.ToBase64String(hash);
        return encData;
    }

我正在尝试在Javascript中转换此代码。我发现this库是帮助者。

这是我正在使用的代码;

 <script>
            var timestamp = 1424890904;
            var client_id = "496ADAA8-36D0-4B65-A9EF-EE4E3659910D";
            var EncryptionKey = "E69B1B7D-8DFD-4DEA-824A-8D43B42BECC5";

            var message = "{timestamp:{0},client_id:{1}}".replace("{0}", timestamp).replace("{1}", client_id);

            var hash = CryptoJS.HmacSHA1(message, EncryptionKey);
            var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);       

             alert(hashInBase64);
        </script>

但上面的代码没有从C#代码生成相同的输出。 我怎样才能在Javascript中实现它?

1 个答案:

答案 0 :(得分:2)

您的问题是由于您的密钥造成的。在C#中,您将传递一个16字节的数组作为密钥。在CryptoJS中,你传入一个CryptoJS正在解释为密码的字符串,因此它将生成一个完全不同的密钥。

编辑:以下是如何在javascript中获取正确的密钥:

如果您将16字节密钥转换为Base64,则可以在javascript中执行以下操作。它将生成一个WordArray作为键,并使用该键生成哈希值。

var keyBase64 = "eFY0EiMBZ0UBI0VniRI0Vg==";
var key = CryptoJS.enc.Base64.parse(keyBase64);
var hash = CryptoJS.HmacSHA1("Hello", key);
var hashInBase64 = CryptoJS.enc.Base64.stringify(hash); 
console.log(hashInBase64);