5.5 中的 PHP 密码函数

PHP 5.5 中的新功能是一组处理密码散列和验证的函数。对于 PHP 应用程序来说,这是一件很常见的事情,因此决定将它包含在 PHP 的核心中。它们有效地解决了散列和比较密码的问题,几乎每个 PHP 开发人员都曾在某个时候实现过这个问题。

只有少数函数可用,但它们提供了从密码创建散列值、检查散列是否有效以及检查是否需要重新创建密码散列所需的所有功能。

要从密码创建哈希值,请使用该password_hash()函数。第一个参数是密码字符串,第二个值是要使用的散列算法。此处的值 PASSWORD_DEFAULT 是当前设置为 bcrypt 算法的 PHP 常量,并且将在较新版本的 PHP 中找到它们时更改为更好的算法。

$password = 'changeme';
$password_hash = password_hash($password, PASSWORD_DEFAULT);

您可以password_hash()通过使用 PASSWORD_BCRYPT 常量来强制该函数始终使用 bcrypt 算法。

$password = 'changeme';
$password_hash = password_hash($password, PASSWORD_BCRYPT);

该password_hash()函数还采用选项数组的第三个参数。这允许您为加密算法设置默认盐和成本。'salt' 值允许您输入一个预先确定的盐,以在对密码进行哈希处理时使用,如果省略此值,则password_hash()函数会生成一个随机盐。

$password_hash = password_hash($password, PASSWORD_DEFAULT, array('salt' => 'sfyaisdyfiosydfsd6f896sd68f8asdftasdiutfisduft'));

'cost' 参数本质上描述了散列算法将运行的迭代次数,尽管它实际上表示对数迭代值。默认值为 10,这是一个很好的基线。增加此值将允许更安全的散列,但会对函数的性能产生不利影响。

$password_hash = password_hash($password, PASSWORD_DEFAULT, array('salt' => 'sfyaisdyfiosydfsd6f896sd68f8asdftasdiutfisduft', 'cost' => 12));

创建散列后,您可以使用该password_verify()函数验证密码是否与散列值匹配。此函数采用的两个参数是密码和散列密码值。

$password = 'changeme';
$password_hash = password_hash($password, PASSWORD_DEFAULT);
if (password_verify($password, $password_hash))) {
  // 密码有效
}

您还可以检查是否需要使用该password_needs_rehash()函数重做密码哈希。这将检查散列密码,如果散列值是由不同的散列算法生成的,则返回 true。这允许您在对算法进行更改时更新现有密码哈希。如果返回 true,则您将再次重新散列密码以将其保存在新算法下。

$password = 'change me';
$password_hash = ''; // 现有密码哈希
if (password_needs_rehash($password_hash, PASSWORD_DEFAULT)) {
  $password_hash = password_hash($password, PASSWORD_DEFAULT);
}

由于password_hash()使用 C crypt 方案创建的密码,您还可以使用password_verify()与从crypt()函数相同的方式检查函数的哈希值password_hash()。

$password = 'password';
$password_hash = crypt($password);
var_dump(password_verify($password, $password_hash));

如果您运行的 PHP 版本低于 5.5,则可以使用密码功能的用户空间实现。您需要做的就是下载password.php文件(在 lib 目录中)并将其包含在您的应用程序中以开始使用这些功能。您还可以将其包装在“if”语句中,以便检测 PHP 的正确版本,并且仅在版本低于 5.5 时才包含密码文件。这种方法的结果是,当您将 PHP 版本升级到 5.5 时,您可以确保您的代码仍然可以工作,您所要做的就是删除这个单一的引用。

if (version_compare(phpversion(), '5.5', '<')) {
  require('password.php');
}