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 →