【问题标题】:HMAC256 from C# to Javascript returns different results从 C# 到 Javascript 的 HMAC256 返回不同的结果
【发布时间】:2019-11-22 02:44:12
【问题描述】:

我想根据我在 Javascript 中的 C# 项目从带有 HMAC 密钥的字符串创建一个 HMAC256 密钥。但是,每个项目都有不同的结果,似乎无法找到使结果相同的方法。

C# 项目

private string CalculateHMAC(string hmacKey, string signingstring) {
  byte[] key = PackH(hmacKey) //returns 32 bit array;
  byte[] data = Encoding.UTF8.GetBytes(signingstring);

  try {
    using(HMACSHA256 hmac = new HMACSHA256(key)) {
      // Compute the hmac on input data bytes
      byte[] rawHmac = hmac.ComputeHash(data);

      // Base64-encode the hmac
      return Convert.ToBase64String(rawHmac);
    }
  } catch (Exception e) {
    throw new Exception("Failed to generate HMAC : " + e.Message);
  }
}

JAVASCRIPT 代码

var hash = CryptoJS.HmacSHA256(byteString, hmacKeyinString);
var msg = hash.toString(CryptoJS.enc.Base64);

提前谢谢你。

在我的 javascript 项目中使用 CryptoJS

【问题讨论】:

  • 这可能真的很难解决,但仔细查看您正在处理的字符串,并寻找特殊字符 - 您可能需要在运行 HMAC 函数之前转义它们- 当我第一次尝试类似的东西时,我特别遇到了反斜杠问题,无论是在 URL 中还是在日期字符串中。尝试在一个小/简单/ASCII 字符串上运行这两个函数,并仔细检查您是否得到相同的输出。
  • @MikeBrockington 您好,我使用的字符串是 'currency:mercacct:merRef:amount:sessionValidity:shipBeforeDate:shopperEmail:skinCode:GBP:Payments:22222.H1324.7622211:12100: 2019-07-17:2019-07-17::231233332"' 我会用完全相同的输入回复您。出于安全原因,我更改了一些信息。
  • 你试过像“test”这样的简单字符串吗?你的JS值也是UTF8吗?
  • 您是在直接比较输出吗?让我感到震惊的另一件事是,远端对比较中包含哪些数据有不同的想法……
  • 用几个在线 HmacSHA256 哈希器尝试相同的值。这可能会帮助您确定是专注于 C# 还是 JS 进行修复。我注意到在线哈希不同,建议尝试一些

标签: javascript c# html hash hmac


【解决方案1】:

用这行代码修复

        var wordsKey = CryptoJS.enc.Hex.parse('yourkey');

        var hash = CryptoJS.HmacSHA256(convertString, wordsKey);
        var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2015-02-24
    • 1970-01-01
    相关资源
    最近更新 更多