首页 > 解决方案 > 匹配 PHP 和 CryptoJS 输出

问题描述

我找不到与链接问题相反的解决方案,并以相同的方式对其进行了测试。由于某些字符,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==
*/

为什么 HMAC sha256 在 PHP 和 Javascript 上返回不同的值

标签: javascriptphp

解决方案


根据您在问题中包含的链接。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==

推荐阅读