正如您在下面看到的,我的php实现产生与JS版本不同的密钥(如果这有什么区别,在Extend Script上运行)。 PHP方面使用默认hash_pbkdf2,JS方使用CryptoJS库。两者都使用SHA256。PBKDF2(php)产生与CryptoJS.PBKDF2(js)不同的输出
我在这里错过了什么吗?
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
您可能应该使用[PBKDF2测试向量](https://www.ietf.org/rfc/rfc6070.txt)来查看它们中是否有任何产生正确结果。 – jww
在PHP实现中的盐总是一个随机的字符串,并在js中使用常量作为盐;你只是没有提供相同的输入到计算功能。或者我错过了什么? –
盐产生一次(523554455475374b5942304448317468),然后采取JS(抱歉,我应该在原来的帖子中指出)。当然,如果我重新运行PHP,如果将创建一个新的盐,这将不得不再次导入到JS。 – tombalev