【问题标题】:Create C# generated HMAC hash in Javascript在 Javascript 中创建 C# 生成的 HMAC 哈希
【发布时间】:2015-02-26 04:46:37
【问题描述】:

我下面有 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 library 作为助手。

这是我正在使用的代码;

 <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 中实现它?

【问题讨论】:

  • 您是否 100% 确定加密密钥和时间戳是准确的?这就是过去经常让我感到困惑的原因......还要比较散列前后的值,以及在 base 64 转换之前和之后的值,看看差异可能在哪里。

标签: javascript c# sha hmacsha1


【解决方案1】:

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

【讨论】:

  • 简单有效。我希望我有 Javascript 等效的 Guid.Parse(encryptionKey).ToByteArray();但无论如何我现在会手动转换它。
  • CryptoJS 可能有一些东西可以做到 - 我没有深入研究他们的帮助库。
猜你喜欢
  • 1970-01-01
  • 2016-10-10
  • 2016-08-20
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 2012-01-17
  • 2014-10-01
  • 2016-08-03
相关资源
最近更新 更多