PBKDF2(php)产生的输出与CryptoJS.PBKDF2(js)不同

时间:2016-01-20 13:40:39

标签: encryption openssl cryptojs pbkdf2

如下所示,我的php实现产生的密钥与JS版本不同(如果有任何不同,则在Extend Script上运行)。 PHP端使用默认的hash_pbkdf2,JS端使用CryptoJS库。两者都使用SHA256。

我在这里错过了什么吗?

PHP方面

$salt = CryptoLib::randomString(128/8);
$password = "test";
$hasher = "sha256";
$iterations = 1000;
$outsize = 256;

$key = hash_pbkdf2($hasher, $password, $salt, $iterations, $outsize/8, true);
$key = bin2hex($key);

盐输出: 523554455475374b5942304448317468

密钥输出: cfb478a18d08030fe97beed34fd2da3abf89bb7975ffdaae9e39102a3b2ea1a2

JS方面

var salt = "523554455475374b5942304448317468";
var password = "test";
var iterations = 1000;
var keySize = 256;

var key = CryptoJS.PBKDF2(password, salt, {keySize: 256/32, iterations: 1000, hasher:CryptoJS.algo.SHA256});

密钥输出: 1264aa07aeab3cf93d4ee86a074697165efffe4914ce98e6d6efd7f28c371b97

1 个答案:

答案 0 :(得分:1)

原来这是ExtendScript的一个问题。如果您使用的是CryptoJS的缩小版本,请确保切换到完整的js版本,因为出于某种原因,ExtendScript将生成不同的值:

示例:

包含缩小的Base64 CryptoJS模块:

salt.toString(CryptoJS.enc.Base64) 
= ADAASDASHFDSFKSD/ASDAHSDJAGLDFblablabla
包含完整Base64 CryptoJS模块的

salt.toString(CryptoJS.enc.Base64)
= Zl0gFqZIc3CczOo/FBlNSn3NPAAsw=