制作一个javascript HMAC令牌

制作一个javascript HMAC令牌,javascript,encryption,encoding,cryptography,hmac,Javascript,Encryption,Encoding,Cryptography,Hmac,我试图使用Crypto.js库在javascript中模拟以下.NET代码 var hashInput = "public=ID1000000001::routetype=POST::route=personsearch::key1=ID1000000001::key2=1043" byte[] inputBytes = new byte[hashInput.Length * sizeof(char)]; System.Buffer.BlockCopy(hashInput.ToCharArray

我试图使用Crypto.js库在javascript中模拟以下.NET代码

var hashInput = "public=ID1000000001::routetype=POST::route=personsearch::key1=ID1000000001::key2=1043"
byte[] inputBytes = new byte[hashInput.Length * sizeof(char)];
System.Buffer.BlockCopy(hashInput.ToCharArray(), 0, inputBytes,0,inputBytes.Length);

byte[] keyBytes = HexadecimalStringToByteArray("A_HEX_STRING_GOES_HERE");

var hmac = HMACSHA256.Create();
hmac.Key = keyBytes;
var clientHash = hmac.ComputeHash(inputBytes);
这给了我一个ByteArray,它是以 [41197254,91244,87…]等

我想在javascript客户机中创建相同的精确字节数组,但我很难做到这一点。我尝试了以下方法:

var stringToHash = 'public=ID1000000001::routetype=POST::route=personsearch::key1=ID1000000001::key2=1043';
var privateKey = 'A_HEX_STRING_GOES_HERE';
var hash = CryptoJS.HmacSHA256(stringToHash, privateKey);
//this results in a WordArray, which can be converted to many types
//however i cannot get the byte array as in the .net example
//i.e. i just want to get [41,197,254,91,244,87....] etc.
我可以在Crypto.js的文档中看到如何转换为base64和其他格式,但没有看到我需要的ByteArray

有什么想法吗

--更新 感谢您提出的不使用BlockCopy的建议,也感谢您为我指出了我完全忽略的编码问题的方向

这是问题的一部分。另一部分是我设法误用了HMACSHA256类。我发现(几个小时后,.NET代码没有生成正确的哈希值)

事实证明,这段代码确实生成了正确的哈希:

        var hashInput = "a::string::to::hash";
        var privateKey = "C0B615950F9D577A4EAF64C9B4F2E50F3DA2C6BB6F790FA346E9732788B29A08AC5444F1B82984DB190A75D3861CC4802D598EBF0025FD1C327928F43EB1C80E";    

        byte[] inputBytes = Encoding.UTF8.GetBytes(hashInput);
        byte[] keyBytes = Encoding.UTF8.GetBytes(privateKey);

        HMACSHA256 hmac = new HMACSHA256(keyBytes);
        hmac.Initialize();
        var clientHash = hmac.ComputeHash(inputBytes);
        var base64 = Convert.ToBase64String(clientHash);

幸运的是,我的WebAPI还没有上线

问题可能是字符编码。例如,您应该在JavaScript中使用方法
encode\u utf8(stringValue)
,在.NET中使用方法
new UTF8Encoding.getBytes(String value)
,以确保字符编码匹配。请注意,现代密码学基于字节,而不是字符串或字符。使用
System.Buffer.BlockCopy()
对字符进行编码是一种非常糟糕的做法。

+1为了更好地定义您的问题,有点令人耳目一新