【问题标题】:CryptoJS and PHP SHA256CryptoJS 和 PHP SHA256
【发布时间】:2013-10-15 21:43:56
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: javascript php sha crypt


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 完美答案,感谢您的深思熟虑和详细的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多