【发布时间】: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