怎么安全地存储我的用户密码?

本教程将介绍如何安全地存储我的用户密码?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

怎么安全地存储我的用户密码? 教程 第1张

问题描述

这比普通的 MD5 安全多少?我刚刚开始研究密码安全性.我对 PHP 很陌生.

$salt = 'csdnfgksdgojnmfnb';

$password = md5($salt.$_POST['password']);
$result = mysql_query("SELECT id FROM users
  WHERE username = '".mysql_real_escape_string($_POST['username'])."'
  AND password = '$password'");

if (mysql_num_rows($result) < 1) {
 /* Access denied */
 echo "The username or password you entered is incorrect.";
} 
else {
 $_SESSION['id'] = mysql_result($result, 0, 'id');
 #header("Location: ./");
 echo "Hello $_SESSION[id]!";
}

推荐答案

确保密码存储方案安全的最简单方法是使用标准库.

由于安全性往往比大多数程序员单独解决的问题要复杂得多,并且存在更多不可见的搞砸可能性,因此使用标准库几乎总是最简单、最安全(如果不是唯一的话)的可用选项.

如果您使用的是 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';
}

请注意:您应该不再需要这个了!这只是出于历史目的.

看看:便携式 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';
}

PHPPass 已在一些非常知名的项目中实现:

phpBB3

WordPress 2.5+ 以及 bbPress

Drupal 7 版本,(可用于 Drupal 5 和 6 的模块)

其他

好处是您不必担心细节,这些细节已由有经验的人编写,并由互联网上的许多人审查.

有关密码存储方案的更多信息,请阅读 Jeff 的博文:您可能存储的密码不正确

如果你选择"的方法,无论你做什么,不要使用 MD5SHA1 了.它们是很好的散列算法,但出于安全目的考虑.

目前,最好使用 crypt 和 CRYPT_BLOWFISH.
PHP 中的 CRYPT_BLOWFISH 是 Bcrypt 哈希的实现.Bcrypt 基于 Blowfish 分组密码,利用其昂贵的密钥设置来降低算法速度.

好了关于怎么安全地存储我的用户密码?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。