php - 安全密码存储

标签 php security passwords md5 password-protection

假设我有成千上万的用户,我想让密码非常安全。现在,我了解到 md5() 并不是最安全的使用方法,但是我认为为了安全起见可以做的就是给它加盐(我知道这不是什么新鲜事)。因此,为此我正在考虑创建两个表,一个名为 accounts 的表将包含与帐户相关的所有信息,一个名为 salt 的表列,第二个表将被称为 something像 auth 并且有字段 account_id, password

首先,我在注册时创建了一个盐(随机生成)

$salt = "#52/sBsO8";

然后所有提供的信息都会转到帐户 salt 是其中之一

然后在成功将信息放入数据库后,我创建了将存储在 auth 表中的密码,这样密码就不是用户输入的密码的 md5,而是它的salt的md5和用户输入的密码

所以auth中的密码是

$password = md5($user_entered_password . $salt);

测试字符串: PHP代码

$password = "123";
$salt = "#52/sBsO8";
echo md5($password) ." / ";
echo md5($password . $salt);

输出:202cb962ac59075b964b07152d234b70/dfbf0b257c5182af0ae893c2680f4594

问题是:这是一种非常安全的处理密码的方式吗?因为用md5()解密网站,所以猜密码的方式有很多种。并且解密网站实际上并不解密 md5() 它们只是拥有数百万个字符串的 md5 哈希值。

最佳答案

md5 可能是“流行”哈希算法中最不安全的。
由于您使用的是 PHP,更好的选择是 crypt: http://php.net/manual/en/function.crypt.php

crypt($password, $salt)

要更好地比较各种散列方法,请参阅 Jeff Atwood's post about password hashing

关于暴力破解基准的摘录:

MD5 23070.7 M/s
SHA-1 7973.8 M/s
SHA-256 3110.2 M/s
SHA-512 267.1 M/s
NTLM 44035.3 M/s
DES 185.1 M/s
WPA/WPA2 348.0 k/s

越低越好,虽然DES is too short to be considered nowadays (56 位,感谢@thebod)。

编辑:

虽然它没有在上面的基准测试方法中列出,但是 crypt 支持的最好的哈希方法是 blowfish,下面是一个使用它的例子:

// $salt has to be built with exactly these components:
// '$2a$' . $2DigitsNumberAroundTen . '$' . $TwentyTwoLetters
$salt = '$2a$07$somesillystringforsalt';
crypt( $password, $salt );

关于php - 安全密码存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10951740/

相关文章:

php - 为什么我应该阻止直接访问不回显任何内容的 PHP 文件?

mysql密码在vb6应用程序中加密

PHP PDO bindValue 使用 MySQL IN()?

php - 我的 PHP 代码只是我的 HTML 内容中的注释

php - 将基于PHP的reCaptcha插入基于jQuery的Shoutbox时遇到很多麻烦

android - 如何安全地临时存储密码?

php - mysql漏洞。将数据保存在 php 文件或 mysql 数据库中

php - 在 Symfony 中为子一对多过滤器添加排序

encryption - 如何设计系统以允许加密迁移?

javascript 重定向表单适用于 Chrome/Safari,但不适用于 Firefox/IE