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

PBKDF2 (php) produces different output than CryptoJS.PBKDF2 (js)

正如您在下面看到的,我的 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

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

示例:

包含缩小的 Base64 CryptoJS 模块:

salt.toString(CryptoJS.enc.Base64) 
= ADAASDASHFDSFKSD/ASDAHSDJAGLDFblablabla

包含完整的 Base64 CryptoJS 模块:

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