如何使JavaScript中字节有效负载的Base64 HmacSHA256签名等效于Java?
在Java中,我们使用允许对任何字节数组进行签名的如何使JavaScript中字节有效负载的Base64 HmacSHA256签名等效于Java?,javascript,java,digital-signature,hmac,cryptojs,Javascript,Java,Digital Signature,Hmac,Cryptojs,在Java中,我们使用允许对任何字节数组进行签名的Mac实例对某些数据进行签名。如何在JavaScript中为同一字节数组生成相同签名的函数 Java实现的一个示例(方法sign使用HmacSHA256对message进行签名,然后将签名转换为url安全的base64字符串): 上面的示例生成q-l6FioFNkAqMIIxX5rs3AF-vngizpapcsshdhmnjf8签名字符串。我试图在JavaScript中创建与sign方法等价的方法来获得相同的签名 function main(){
Mac
实例对某些数据进行签名。如何在JavaScript中为同一字节数组生成相同签名的函数
Java实现的一个示例(方法sign
使用HmacSHA256
对message
进行签名,然后将签名
转换为url安全的base64字符串):
上面的示例生成q-l6FioFNkAqMIIxX5rs3AF-vngizpapcsshdhmnjf8
签名字符串。我试图在JavaScript中创建与sign
方法等价的方法来获得相同的签名
function main(){
var secret = [5];
secret[0] = 0x1e;
secret[1] = 0x03;
secret[2] = 0x01;
secret[3] = 0x02;
secret[4] = 0x03;
var message = [5];
message[0] = 0x01;
message[1] = 0x03;
message[2] = 0x02;
message[3] = 0x1e;
message[4] = 0x03;
console.log(sign(secret, message));
}
function sign(secret, message){
// ?
}
我找不到使用
CryptoJS
对字节进行签名的方法。Base64和HmacSHA256应在安装后包含在CryptoJS中。尝试以下方法:
function sign(secret, message){
const hash = CryptoJS.HmacSHA256(message.join(''), secret.join(''));
const hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
return hashInBase64}
解决办法似乎并不复杂。在使用
CryptoJS
之前,我们必须正确地将字节数组转换为字符串。返回base64
string后,我们应该将其转义为url友好字符串
function sign(secret, message){
var secretString = String.fromCharCode.apply(String, secret);
var messageString = String.fromCharCode.apply(String, message);
var hash = CryptoJS.HmacSHA256(messageString, secretString);
return CryptoJS.enc.Base64.stringify(hash).replace(/\+/g, '-').replace(/\//g, '_').replace(/\=+$/, '');
}
不起作用。它返回
nfUj2bwfcLQTTcGxgfNgH2xJiyGt3HORnT2cPraK4ns=
,但应返回问题中描述的q-l6FioFNkAqMIIxX5rs3AF-vngigzpapcsshdhmnjf8
。
function sign(secret, message){
var secretString = String.fromCharCode.apply(String, secret);
var messageString = String.fromCharCode.apply(String, message);
var hash = CryptoJS.HmacSHA256(messageString, secretString);
return CryptoJS.enc.Base64.stringify(hash).replace(/\+/g, '-').replace(/\//g, '_').replace(/\=+$/, '');
}