2016-01-20 63 views
0

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

+0

您可能应该使用[PBKDF2测试向量](https://www.ietf.org/rfc/rfc6070.txt)来查看它们中是否有任何产生正确结果。 – jww

+0

在PHP实现中的盐总是一个随机的字符串,并在js中使用常量作为盐;你只是没有提供相同的输入到计算功能。或者我错过了什么? –

+0

盐产生一次(523554455475374b5942304448317468),然后采取JS(抱歉,我应该在原来的帖子中指出)。当然,如果我重新运行PHP,如果将创建一个新的盐,这将不得不再次导入到JS。 – tombalev

回答

1

它原来是用ExtendScript的问题。如果您使用CryptoJS的精缩版,请确保您切换到全JS版本,因为某种原因ExtendScript会产生不同的值:

例子:

与精缩的Base64 CryptoJS模块包括:

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

以饱满的Base64 CryptoJS模块包括:

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

我不明白Base64与你的问题有什么关系。它看起来像忘了解码盐:'salt = CryptoJS.enc.Hex.parse(salt)'。 –

+0

我使用Base64作为使用ExtendScript和缩小版js时产生不同输出的示例。它看起来和其他的enc函数一样,所以它产生了不同的输出。两个输出(php和js)在声明完整版本而不是缩小后生成了相同的变量。 – tombalev