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

在Javascript中创建C#生成的HMAC哈希,javascript,c#,sha,hmacsha1,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).T

我有下面的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转换此代码。我发现图书馆是我的助手

这是我正在使用的代码

 <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>

var时间戳=1424890904;
var客户_id=“496ADAA8-36D0-4B65-A9EF-EE4E3659910D”;
var EncryptionKey=“E69B1B7D-8DFD-4DEA-824A-8D43B42BEC5”;
var message=“{timestamp:{0},客户端id:{1}}”。替换(“{0}”,timestamp)。替换(“{1}”,客户端id);
var hash=CryptoJS.HmacSHA1(消息,加密密钥);
var hashInBase64=CryptoJS.enc.Base64.stringify(散列);
警报(hashInBase64);
但是上面的代码并没有从C代码生成相同的输出。
如何在Javascript中实现它?

您的问题在于您的密钥。在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);

您是否100%确定加密密钥和时间戳是准确的?这就是我过去经常犯的错误。。。。还要比较散列前后的值,再比较base 64转换前后的值,看看差异可能在哪里。我希望我有与Guid.Parse(encryptionKey.ToByteArray()等价的Javascript;但无论如何,我现在将手动转换它。CryptoJS可能有一些东西可以做到这一点——我没有深入挖掘他们的帮助程序库。