Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使JavaScript中字节有效负载的Base64 HmacSHA256签名等效于Java?_Javascript_Java_Digital Signature_Hmac_Cryptojs - Fatal编程技术网

如何使JavaScript中字节有效负载的Base64 HmacSHA256签名等效于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(){

在Java中,我们使用允许对任何字节数组进行签名的
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(/\=+$/, '');
}