【问题标题】:how to do crypt and password_hash in php 5.6 [closed]如何在 php 5.6 中进行 crypt 和 password_hash [关闭]
【发布时间】:2015-12-14 17:35:42
【问题描述】:

嗨,谁能告诉我如何在php 5.6 中使用crypt() 和password_hash 吗? 因为我试过了,它一直给我这个错误

注意:crypt():没有指定盐参数。

您必须使用随机生成的盐和强哈希函数来生成安全哈希。

【问题讨论】:

  • 只需使用 password_hash() 和默认值。它生成一个安全的盐,并使用可用于给定 PHP 版本的最安全的哈希算法,目前是 bcrypt。 password_hash() 本质上只是 crypt() 的包装,具有安全的默认值,因为几乎没有人知道如何正确使用该功能。
  • 你真的不应该在密码哈希上使用你自己的盐,你真的应该使用 PHP 的built-in functions 来处理密码安全。如果您使用的 PHP 版本低于 5.5,则可以使用 password_hash() compatibility pack

标签: php crypt password-hash


【解决方案1】:

用法很简单,总结如下:

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

password_hash() 函数实际上是 crypt() 函数的一个包装器,用于处理诸如生成安全盐之类的困难部分,并使其面向未来。所以不需要直接调用crypt()。

【讨论】:

    【解决方案2】:

    函数声明如下:

    string crypt ( string $str [, string $salt ] )
    

    但是the documentation 注意到这一点:

    salt 参数是可选的。但是,crypt() 会创建一个没有 salt 的弱密码。如果没有它,PHP 5.6 或更高版本会引发 E_NOTICE 错误。确保指定足够强的盐以提高安全性。

    也就是说,如果你想继续使用没有盐的函数(这将是愚蠢的),或者使用盐,你只需忽略该通知。

    但是请注意,文档继续这样说:

    password_hash() 使用强哈希,生成强盐,并自动应用适当的轮次。 password_hash() 是一个简单的 crypt() 包装器,并且与现有的密码哈希兼容。 鼓励使用password_hash()

    (最后的重点是我的。)

    【讨论】:

    • @RyanVincent crypt 提供 bcrypt 实现。所以,是的,它只是在内部包装 crypt。
    • 不向crypt() 函数提供盐是致命的,然后它会计算一个未加盐的 DES 或 MD5 哈希,这与存储它们的明文几乎相同。但正如您所写,没有理由直接调用 crypt() 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 2011-03-09
    • 2021-07-26
    • 2017-04-06
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    相关资源
    最近更新 更多