确保密码存储方案安全的最简单方法是使用标准库。
由于安全性往往要比大多数程序员独自解决的复杂得多,并且具有更多看不见的破坏可能性,因此使用标准库几乎总是最简单,最安全(如果不是唯一的话)的可用选项。
新的PHP密码API(5.5.0+)
如果您使用的是PHP 5.5.0或更高版本,则可以使用新的简化密码哈希API
使用PHP的密码API的代码示例:
<?php
// $hash is what you would store in your database
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT, ['cost' => 12]);
// $hash would be the $hash (above) stored in your database for this user
$checked = password_verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
(如果您仍在使用旧版5.3.7或更高版本,则可以安装ircmaxell / password_compat以访问内置函数)
改善盐渍哈希:加胡椒粉
如果您想要额外的安全性,安全人员现在(2017年)建议在(自动)加盐的密码哈希中添加“ Pepper ”。
我推荐使用一个简单的类来安全地实现此模式,我建议:
Netsilik / PepperedPasswords
(github)。
它带有MIT许可证,因此即使在专有项目中,您也可以随意使用它。
使用的代码示例Netsilik/PepperedPasswords
:
<?php
use Netsilik/Lib/PepperedPasswords;
// Some long, random, binary string, encoded as hexadecimal; stored in your configuration (NOT in your Database, as that would defeat the entire purpose of the pepper).
$config['pepper'] = hex2bin('012345679ABCDEF012345679ABCDEF012345679ABCDEF012345679ABCDEF');
$hasher = new PepperedPasswords($config['pepper']);
// $hash is what you would store in your database
$hash = $hasher->hash($_POST['password']);
// $hash would be the $hash (above) stored in your database for this user
$checked = $hasher->verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
OLD标准库
请注意:您不再需要此功能!这仅出于历史目的。
看一下:可移植的PHP密码哈希框架:phpass,并确保CRYPT_BLOWFISH
尽可能使用该算法。
使用phpass(v0.2)的代码示例:
<?php
require('PasswordHash.php');
$pwdHasher = new PasswordHash(8, FALSE);
// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );
// $hash would be the $hash (above) stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
PHPass已在一些众所周知的项目中实现:
- phpBB3
- WordPress 2.5+以及bbPress
- Drupal 7版本(模块可用于Drupal 5和6)
- 其他
好消息是,您不必担心细节,这些细节是由经验丰富的人编写的,并已由Internet上的许多人检查过。
有关密码存储方案的更多信息,请阅读Jeff的博客文章:您可能不正确地存储了密码
如果您采用“ 我会自己做,谢谢 ”的方法,无论您做什么,都不要使用MD5
或SHA1
不再使用。它们是很好的哈希算法,但是出于安全考虑被认为是无效的。
当前,最好将CRYPT_BLOWFISH与crypt一起使用。
PHP中的CRYPT_BLOWFISH是Bcrypt哈希的实现。Bcrypt基于Blowfish块密码,利用其昂贵的密钥设置来减慢算法速度。