匹配PHP和CryptoJS输出

时间:2018-05-04 04:26:08

标签: javascript php

我无法找到与链接问题相反的解决方案,并以相同的方式对其进行了测试。由于某些字符,php和javascript给出了不同的值。下面的示例代码给出了不同的输出,但没有附加的字符253 javascript和php匹配。如何修改我的javascript代码以匹配php代码?

    $test = 'test'.chr(253);
    $key = 'key';
    $sign = hash_hmac('sha512',$test,$key,true);
    $sign = base64_encode($sign);
    var_dump($sign);

/* 
oMb9XiT7Y18wYJ7m0kOaIebZrS7eY+/odXmHLq5xPjRVbNfdcwBYQGycRKQ0n7EgqFmF+Ul3oucJHH2AK/IYLw==
*/

    var test = 'test'+String.fromCharCode(253);
    var key = 'key';
    var sign = CryptoJS.HmacSHA512(test,key);
    var sign = CryptoJS.enc.Base64.stringify(sign);
    Console.log(sign);

/*
rQ5cGz9eMTKQpA3a8zzzNmwoXatSmOiBQBtV1gqs7oAGqn6XMwxq0Ww0tmtVbmpqlEVJ9xeYFMzka749c5vIvQ==
*/

Why HMAC sha256 return different value on PHP & Javascript

1 个答案:

答案 0 :(得分:0)

根据您提问中的链接。 CryptoJS将字符串解释为UTF-8。字符ý是UTF-8 chr(195).chr(189)中的两个字节,因此您的JavaScript等同于散列PHP字符串'test'.chr(195).chr(189)

要在JavaScript中获取PHP结果,您需要手动使用您想要的编码(Latin1)将数组解析为Cypto.lib.WordArray,以便它不会采用UTF-8:

var test = CryptoJS.enc.Latin1.parse( 'test'+String.fromCharCode(253) );
// oMb9XiT7Y18wYJ7m0kOaIebZrS7eY+/odXmHLq5xPjRVbNfdcwBYQGycRKQ0n7EgqFmF+Ul3oucJHH2AK/IYLw==