Javascript的pack函数与php的pack函数不匹配

时间:2019-07-18 03:33:44

标签: javascript php pack

在我的项目中,我需要在客户端(javascript)中创建一个哈希安全字符串,并将其发送到服务器(php)。服务器检查有效 在执行其他操作之前是否对安全字符串进行哈希处理。

但是问题是javascript中生成的安全哈希字符串与PHP中生成的安全哈希字符串不匹配。

我已经尝试过this related solution,但对于我来说似乎不起作用。

这是我的PHP代码

$message = '123';
$secure_secret = 'e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4';
$pack = pack('H*', $secure_secret);
$hash = hash_hmac('SHA512', $message, $pack);
var_dump('pack: ' . pack('H*', $secure_secret));
var_dump('hash: ' . $hash);

以上内容与之相呼应:

b"pack: åéú\e£\x1EÍ\x1AèOuʪGO:f?\x05ô"
"hash: 5a7c65c2d0ec43b9c5fc255f36518fa3e6083d40db848768309e272973c200c4f3085466fd852cffbd962ec54cd0bd716d0deee6d76899943875d8da56143585"

这是JavaScript代码(我正在使用locutus's pack function for js):

var message = '123';
var secure_secret = 'e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4';
var pack = pack('H*', $secure_secret);
var hash = crypto.createHmac('SHA512', pack).update(message);
console.log('pack: ' + pack);
console.log('hash: ' + hash)

结果:

pack: åéú£ÍèOuʪGO:f?ô
hash: 2ab66f2f2b79968549f2744f55ab50b6b3249812d5c45d54b7fb2b24ceb173e3437dc191150bb4d3972a81ec7ea420fb5b58d9e5d4c9ba567d85566410d7508f

但是,如果我将$ secure_secret字符串更改为另一个更简单的字符串,例如'321',则结果将匹配。

PHP:

$message = '123';
$secure_secret = '321';
$pack = pack('H*', $secure_secret);
$hash = hash_hmac('SHA512', $message, $pack);
var_dump('pack: ' . pack('H*', $secure_secret));
var_dump('hash: ' . $hash);

结果

"pack: 2\x10"
"hash: deefdd44d55c5fe786ed3f1c09e3b32f32459dd885a970fe01091fecc17ef12162080c011e58fb7cd2f420a070f48c27ba19be9b92f07081a6f7908536f3eed9"

Javascript:

var message = '123';
var secure_secret = '321';
var pack = pack('H*', $secure_secret);
var hash = crypto.createHmac('SHA512', pack).update(message);
console.log('pack: ' + pack);
console.log('hash: ' + hash)

结果:

pack: "2?"
hash: deefdd44d55c5fe786ed3f1c09e3b32f32459dd885a970fe01091fecc17ef12162080c011e58fb7cd2f420a070f48c27ba19be9b92f07081a6f7908536f3eed9

那我该如何解决呢? 谢谢。

0 个答案:

没有答案