2016-01-20 66 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