2011-04-01 130 views
2

你使用什么?使用它有什么好处?存储mysql密码的最佳方法?

给我所有的技巧,优点和缺点的所有教程没有告诉你的内幕。

+0

存储密码一个MySQL数据库或在MySQL中存储密码... – deceze 2011-04-01 02:00:50

+0

您的意思是在MySQL中存储密码,或者存储您的程序中需要访问数据库的MySQL密码? – Sergey 2011-04-01 02:01:05

+0

在存储用户密码的表中 – PHP 2011-04-01 02:05:14

回答

8

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

+0

许多致力于bcrypt upvotes在这里。散列用户密码以对存储的密码进行测试的情况相对较少,因此使用.1s来执行该操作应该不成问题。但是,尝试在相同的10/s下对哈希进行强力攻击,并且永远不会完成。随着硬件标准的提出,Bcrypt也可以进行调整,以便进行更多的工作,从而使其兼容。 – 2011-04-01 13:05:12

+0

是的,是什么促使我bcrypt读到一个网站被黑客入侵,他们的用户数据库被下载。在这种情况下,如果您使用快速哈希,那么可以避免攻击者通过密码强制攻击。 – 2011-04-01 16:30:25

+0

@JosephMastey我很怀疑。如果你用.1s来测试密码,你的服务器是不是很容易被DDoS攻击? – 2013-01-19 18:07:52

-1

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

md5($password); 

将给出md5加密值。

+1

有人快速告诉我这个散列代表什么:'18126e7bd3f84b3f3e4df094def5b7de'并证明为什么盐是必须的。 – 2011-04-01 02:13:35

+3

这是mike哈哈盐是必须的! – PHP 2011-04-01 02:15:33

+0

仅使用密码使用MD5是不安全的。它可以使用[彩虹表](http://en.wikipedia.org/wiki/Rainbow_table)进行攻击(一个表包含MD5散列,用于查找应用于MD5函数的原始值的可能值)。 备注:MD5不是加密函数,而是哈希函数 – VCD 2013-07-23 04:09:11

-1

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

md5(sha1($password)); 

或只是这样的:

md5(md5($password)); 
+0

好处是加强加密 – Nabeel 2011-04-01 02:14:24

+1

md5不加密,也不是加密,也不是sha1 – 2011-04-01 02:14:47

+0

好吧,这是一个计算。而且因为它改变了条目的方式,不应该让它回到原来的位置;它将是encrypton – Nabeel 2011-04-01 02:18:03

0

你要存储原始密码,这样

md5($password) 

登录脚本schould是这样的:

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

这实际上应该更加复杂,但对于概念化来说,它已经被简化了。

+0

单独使用密码使用MD5是不安全的。它可以使用[彩虹表](http://en.wikipedia.org/wiki/Rainbow_table)进行攻击(一个表包含MD5散列,用于查找应用于MD5函数的原始值的可能值)。 – VCD 2013-07-23 04:11:53

+0

本示例不包含腌制密码或高级哈希方法。它只是一个简单的用户查找,无需返回任何用户名和密码。 – 2013-07-23 13:34:36

+1

我对这个答案的理解是,它鼓励人们用MD5散列密码并将其存储在数据库中,这已知是不安全的。如果这个例子只是简单地做一个用户查询,那么这个答案与询问如何存储密码的问题无关。此外,我不认为简单的用户查找应该使用密码作为过滤条件。 – VCD 2013-07-24 02:25:11

1

散列在存储密码中很常见。但它们都是一样的,只是它产生的哈希结果越长,被黑客攻击的难度就越大。来自相同散列函数的散列结果通常具有相同的长度。对输入文本(长度无限制)没有限制,可以从多个句子/单词中产生1个相同的散列字符串。这是洞所在的地方。阅读更多关于pigeonhole principleBirthday Attack

我通常使用MD5()。但它已经超出了我猜测的标准,因为一些碰撞事情。不知何故,人们发明了一种可以检测1个散列字符串的系统,其中多个实际字符串为 。

使用SHA代替。为了使它更安全,你可以在它上面添加$ salt,使它成为双重保护,所以,首先对实际密码进行哈希,将哈希值加入哈希密码,然后再次哈希它们。

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

一些推荐bcrypt,但我从来没有使用过它。

+0

谢谢我从来不知道鸽子的原理。 – PHP 2011-04-01 02:24:34

-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