PHP
加密 | Cryptography

password_hash

password_hash

(PHP 5 >= 5.5.0, PHP 7)

password_hash — Creates a password hash

描述

string password_hash ( string $password , integer $algo [, array $options ] )

password_hash()使用强大的单向哈希算法创建新的密码哈希。password_hash()与crypt()兼容。因此,由crypt()创建的密码哈希可以与password_hash()一起使用。

目前支持以下算法:

  • PASSWORD_DEFAULT - 使用bcrypt算法(默认为PHP 5.5.0)。请注意,随着新的更强大的算法添加到PHP中,此常量将随时间而变化。出于这个原因,使用这个标识符的结果的长度会随着时间而改变。因此,建议将结果存储在可扩展超过60个字符的数据库列中(255个字符将是一个不错的选择)。

  • PASSWORD_BCRYPT- 使用CRYPT_BLOWFISH算法创建散列。这将使用“$2y$”标识符产生标准的crypt()兼容散列。结果将始终为60个字符的字符串,或者失败时返回FALSE

支持的选项:

  • - 在散列密码时手动提供salt以供使用。请注意,这将覆盖并防止salt自动生成。如果省略,每个密码散列都会通过password_hash()生成随机salt 。这是预定的操作模式。

  • cost - 表示应该使用的算法成本。这些值的例子可以在crypt()页面找到。

如果省略,则使用默认值10。这是一个很好的基准成本,但您可能需要考虑根据您的硬件来增加它。

参数

password

用户的密码。

警告

使用PASSWORD_BCRYPT算法将导致password参数被截断为最大长度为72个字符。

algo

一个密码算法constant表示的散列算法的密码时使用。

options

包含选项的关联数组。有关每种算法支持的选项的文档,请参阅密码算法常量

如果省略,则会创建一个随机salt,并使用默认成本。

返回值

返回哈希密码,或者失败时返回FALSE

所使用的算法,成本和盐将作为散列的一部分返回。因此,所有需要验证散列的信息都包含在其中。这允许password_verify()函数验证散列,而不需要单独存储salt或算法信息。

示例

Example #1 password_hash() example

<?php /**  * We just want to hash our password using the current DEFAULT algorithm.  * This is presently BCRYPT, and will produce a 60 character result.  *  * Beware that DEFAULT may change over time, so you would want to prepare  * By allowing your storage to expand past 60 characters (255 would be good)  */ echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT ?>

上面的例子会输出类似于:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

示例#2 password_hash()手动设置成本示例

<?php /**  * In this case, we want to increase the default cost for BCRYPT to 12.  * Note that we also switched to BCRYPT, which will always be 60 characters.  */ $options = [     'cost' => 12, ]; echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options ?>

上面的例子会输出类似于:

$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K

示例#3 password_hash()手动设置salt的示例

<?php /**  * Note that the salt here is randomly generated.  * Never use a static salt or one that is not randomly generated.  *  * For the VAST majority of use-cases, let password_hash generate the salt randomly for you  */ $options = [     'cost' => 11,     'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM), ]; echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options ?>

上面的例子会输出类似于:

$2y$11$q5MkhSBtlsJcNEVsYh64a.aCluzHnGog7TQAKVmQwO9C8xb.t89F.

示例#4 password_hash()示例找到了很好的成本

<?php /**  * This code will benchmark your server to determine how high of a cost you can  * afford. You want to set the highest cost that you can without slowing down  * you server too much. 8-10 is a good baseline, and more is good if your servers  * are fast enough. The code below aims for ≤ 50 milliseconds stretching time,  * which is a good baseline for systems handling interactive logins.  */ $timeTarget = 0.05; // 50 milliseconds  $cost = 8; do {     $cost++;     $start = microtime(true     password_hash("test", PASSWORD_BCRYPT, ["cost" => $cost]     $end = microtime(true } while (($end - $start) < $timeTarget echo "Appropriate Cost Found: " . $cost; ?>

上面的例子会输出类似于:

Appropriate Cost Found: 10

Notes

警告

强烈建议您不要为此函数生成自己的salt。如果你没有指定,它会自动为你创建一个安全的salt。

如上所述,在PHP 7.0中提供salt选项将生成弃用警告。手动提供salt的支持可能会在未来的PHP版本中被删除。

注意:建议您在服务器上测试此功能,并调整成本参数,以便在交互式系统上执行此功能的时间少于100毫秒。上例中的脚本将帮助您为硬件选择一个良好的成本价值。

注意:通过此功能更新支持的算法(或更改为默认算法)必须遵循以下规则:

  • 任何新算法必须至少在PHP的核心版本中才能成为默认版本。因此,例如,如果在7.5.5中添加了新算法,那么直到7.7(因为7.6将是第一个完整版本),它将不符合缺省条件。但是,如果在7.6.0中添加了不同的算法,则它也可以在7.7.0处默认。

  • 默认值只能在完整版本(7.3.0,8.0.0等)中更改,而不能在修订版本中更改。唯一的例外是在当前默认情况下发现严重安全缺陷时的紧急情况。

另请参阅

  • password_verify() - 验证密码是否与散列匹配

  • crypt() - 单向字符串散列

← password_get_info

password_needs_rehash →