【发布时间】:2016-01-20 13:40:39
【问题描述】:
正如您在下面看到的,我的 php 实现生成的密钥与 JS 版本不同(如果有任何区别,则在扩展脚本上运行)。 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
【问题讨论】:
-
您可能应该使用PBKDF2 Test Vectors 来查看它们中的任何一个是否产生了正确的结果。
-
php实现中的salt总是一个随机字符串,而在js中你使用一个常量作为salt;您只是没有为计算函数提供相同的输入。还是我错过了什么?
-
Salt 生成一次 (523554455475374b5942304448317468) 然后带到 JS(对不起,我应该在原帖中指出这一点)。当然,如果我重新运行 PHP,if 将创建一个新的盐,必须再次导入到 JS。
-
我还应该指出 PHP PHP 加密/解密工作得很好,并且生成的密钥返回相同的值(从字符串解码盐之后)。所以我相信它一定是 CryptoJS 的一些实现,它可能期望不同格式的变量(?)
标签: encryption openssl cryptojs pbkdf2