首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

password_hash

(PHP 5 >= 5.5.0, PHP 7)

password_hash — Creates a password hash

描述

代码语言:javascript
复制
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 。这是预定的操作模式。
  • 警告 从PHP 7.0.0开始,salt选项已被弃用。现在首选简单地使用默认生成的。
  • cost - 表示应该使用的算法成本。这些值的例子可以在crypt()页面找到。

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

参数

password

用户的密码。

警告

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

algo

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

options

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

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

返回值

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

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

示例

Example #1 password_hash() example

代码语言:javascript
复制
<?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);
?>

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

代码语言:javascript
复制
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

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

代码语言:javascript
复制
<?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);
?>

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

代码语言:javascript
复制
$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K

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

代码语言:javascript
复制
<?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);
?>

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

代码语言:javascript
复制
$2y$11$q5MkhSBtlsJcNEVsYh64a.aCluzHnGog7TQAKVmQwO9C8xb.t89F.

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

代码语言:javascript
复制
<?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;
?>

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

代码语言:javascript
复制
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 →

扫码关注腾讯云开发者

领取腾讯云代金券