存储mysql密码的最佳方法?

时间:2011-04-01 01:59:19

标签: php

你用什么?使用它有什么好处?

将所有技巧的优缺点归结为所有教程都没有告诉你的优缺点。

6 个答案:

答案 0 :(得分:8)

简短的回答是:你没有。实际存储的是通过单向哈希函数运行用户密码的结果。在我想到使用像MD5这样的东西之前我会好好阅读this并建议查看bcrypt,因为它可以帮助抵御暴力攻击。

答案 1 :(得分:1)

哈希在存储密码时很常见。但它们都是一样的,只是它产生的哈希结果越长,就越难被黑客攻击。来自相同散列函数的散列结果通常具有相同的长度。在不限制输入文本(长度不受限制)的情况下,您可以从多个句子/单词生成1个相同的哈希字符串。这就是洞所在的地方。详细了解pigeonhole principleBirthday Attack

我通常使用MD5()。但它已经超出标准我猜是因为有些碰撞了。不知何故,人们发明了一种能够检测出1个散列弦的系统 不止一个真正的字符串。

使用SHA代替。为了使它更安全,你可以添加$ salt,使其成为双重保护,因此,首先哈希实际密码,将盐添加到哈希密码,然后再次哈希。

请记住,结果字符串越长越好。

有人推荐bcrypt,但我以前从未使用它。

答案 2 :(得分:0)

您需要像这样存储原始密码

md5($password)

您的登录脚本应该是这样的:

$sql = "SELECT `id` WHERE username=`$username` AND password=`" . md5($password) . "`";
$result = mysql_query($sql,$link);
if (mysql_num_rows($result) == 1) {
  // user is authenticated
}

这实际上应该更复杂,但是为了概念化,它已经被简化了。

答案 3 :(得分:-1)

存储密码的简单但安全的方法是使用MD5加密。

md5($password);

将给出md5加密值。

答案 4 :(得分:-1)

您可以使用两种或更多种加密算法的组合。 例如:

md5(sha1($password));

或者就像这样:

md5(md5($password));

答案 5 :(得分:-1)

为了简单起见,使用md5加盐。 MD5是单向哈希。例如:

md5("hello") = "5d41402abc4b2a76b9719d911017c592"

因此,如果没有盐,您最终会将“5d41402abc4b2a76b9719d911017c592”保存到您的数据库中。然后当通过输入密码尝试登录时,将输入密码的md5与您保存的md5进行比较。

if (md5($input_password) == "5d41402abc4b2a76b9719d911017c592")
    log_in_user();

然而,md5是不安全的,因为x的md5总是y。因此,如果您要破坏数据库并找到列为“y”的密码,那么如果您已创建或下载了md5查找表,则您知道密码为“x”。

取而代之的是:

$password_to_save_to_db = md5(md5($input_password . $date_user_registered)); 

因此,每个用户都有自己独特的盐,这些查找表将变得无用。 (它可以为黑客想要窃取的每个密码重新创建,但这更耗时,加上双md5会让事情变得更加困难。

您可以在http://sameerparwani.com/posts/using-salts-for-extra-security

了解更多信息