首页
学习
活动
专区
工具
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 →

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com