【问题标题】:PBKDF2 (php) produces different output than CryptoJS.PBKDF2 (js)PBKDF2 (php) 产生与 CryptoJS.PBKDF2 (js) 不同的输出
【发布时间】: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


【解决方案1】:

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

例子:

包含缩小的 Base64 CryptoJS 模块:

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

包含完整的 Base64 CryptoJS 模块:

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

【讨论】:

  • 我不明白 Base64 与您的问题有什么关系。看起来您似乎忘记解码盐:salt = CryptoJS.enc.Hex.parse(salt).
  • 我以 Base64 为例,在使用带有缩小 js 版本的 ExtendScript 时产生不同的输出。看起来它对其他 enc 函数也是如此,因此它产生了不同的输出。在声明完整版本而不是缩小版本后,两个输出(php 和 js)都生成了相同的 var。
猜你喜欢
  • 1970-01-01
  • 2013-08-06
  • 2015-12-27
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
相关资源
最近更新 更多