1

我想让CryptoJS 的 SHA256 和 php 的 Crypt SHA256 输出都匹配。

PHP crypt 有一个盐和若干轮。例如,对于 5000 轮和“usesomesillystringforsalt”的盐,它会是;

$hash = crypt('Clear Text String', '$5$rounds=5000$usesomesillystringforsalt$');

我希望我不是盲目的,但我找不到如何在 crypto-js 中重现这种行为。它的语法似乎不允许循环或加盐。

是否有可能或者我应该只使用基本的PHP 哈希而不是 crypt?

4

1 回答 1

1

CryptoJS API 不提供为 SHA256 指定盐或轮数的方法。如有必要,您可以手动添加盐,并且指定轮数没有意义,因为“普通”SHA256 始终使用固定数量的轮数(64)。

PHP 中的轮数crypt()实际上定义了连续应用 SHA256 算法的频率,以增加暴力攻击的复杂性。PHP 源代码对此注释如下:“通过 SHA256 重复运行收集的哈希值以消耗 CPU 周期”

正如您在源代码(此处此处)中所见,crypt()它实际上是一个密钥派生函数,仅使用 SHA256 来生成加密安全的加盐哈希。所以它也不是简单地将给定的盐附加到键上,而是一个更复杂的过程。

因此,使用 CryptoJS 提供的算法不可能得到相同的结果。

crypt()主要用于密码哈希。因此,如果您需要将哈希用于其他目的,hash()这是一个很好的选择(当然会产生与 完全相同的结果CryptoJS.SHA256())。

但是,请记住,任何使用 JavaScript 的加密通常都被认为是有害的。因此,如果可能,最好在应用程序中使用 SSL,并在服务器端生成哈希值。如果这是一个选项,请查看bcrypt

于 2013-10-15T13:43:56.210 回答