获得密码存储方案安全的最简单方法是使用标准库.
由于安全性往往要复杂得多,而且比大多数程序员单独处理的可能性更不可见,所以使用标准库几乎总是最简单和最安全的(如果不是唯一的)可用选项。
新的PHP密码API(5.5.0+)
如果使用的是PHP5.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 Comat访问内置函数)
改进盐渍散列:加入胡椒粉
如果你想要额外的安全,安全人员现在(2017年)建议增加一个‘胡椒粉‘到(自动)咸密码散列。
有一个简单的类可以安全地实现这个模式,我建议:Netsilik/PepperedPassword (GitHub).
它附带麻省理工学院的许可证,所以你可以任意使用它,甚至在专有项目中也是如此。
代码使用示例Netsilik/PepperedPasswords:<?phpuse 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('012345679ABCDEF01234
5679ABCDEF012345679ABCDEF012345679ABCDEF');$hasher = new PepperedPasswords($config['pepper']);// $hash is what you would store in yo
ur database$hash = $hasher->hash($_POST['password']);// $hash would be the $hash (above) stored in your database for this user$chec
ked = $hasher->verify($_POST['password'], $hash);if ($checked) {
echo 'password correct';} else {
echo 'wrong credentials';}
旧标准图书馆请注意:你不应该再需要这个了!这只是为了历史的目的。
看一看:可移植PHP密码散列框架: PPASS并确保您使用CRYPT_BLOWFISH算法,如果有可能的话。
使用phpass(v0.2)的代码示例:<?phprequire ('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)
好的是,你不需要担心细节,这些细节已经由有经验的人编程,并在互联网上的许多人审查。
有关密码存储方案的详细信息,请参阅杰夫博文:你可能把密码放错了
不管你做什么如果你去我自己来,谢谢“接近,不使用MD5或SHA1更多..它们是不错的散列算法,但是考虑到了为安全目的而中断.
目前,使用地窖,使用地窖_河豚是最好的做法。
PHP中的crypt_BUFISH是bcrypt散列的一个实现。bcrypt基于Blowfish分组密码,利用它昂贵的密钥设置来降低算法的速度。