MySQL密码功能

时间:2009-11-17 19:24:02

标签: mysql passwords

使用MySQL的密码功能来散列应用程序使用的密码是否被认为是好的还是坏的做法?我可以看到利弊。我很好奇是否对它的好坏有一个普遍的共识。

4 个答案:

答案 0 :(得分:23)

MySQL PASSWORD()函数的文档说明:

  

PASSWORD()函数由MySQL服务器中的身份验证系统使用;你不应该在你自己的应用程序中使用它。

阅读“You're Probably Storing Passwords Incorrectly”以获得有关散列和存储密码的更好建议。

MD5和SHA-1被认为太弱而无法用于密码。目前的建议是使用SHA-256。

我为MySQL提供了一个补丁来支持SHA2()功能,补丁已被接受,但由于他们的路线图已经改变,因此不清楚何时将其变成已发布的产品。

与此同时,您可以在编程语言中使用散列和salting,并将结果散列摘要存储在数据库中。如果使用PHP,则hash()函数中提供SHA-256。

更新:MySQL 5.5.8于2010年12月发布,该版本包含对SHA2()功能的支持。

答案 1 :(得分:10)

如果你使用数据库函数来散列密码,那么根据定义,他们必须在没有散列的数据库中到达:我宁愿更接近“源”,即在前端应用程序中,所以你不要四处传播暴露的信息。

答案 2 :(得分:6)

我相信MySQL中的实际PASSWORD函数是不安全的,并且已被破坏,但我目前找不到链接。我知道较旧的那个(5分及以上OLD_PASSWORD)绝对不安全。

当然,所有密码都应该与盐一起存储(为了进一步默默无闻)。例如:

UPDATE users SET password=MD5(CONCAT('salt', 'user provided value')) WHERE id=54

还有MD5功能,但随着巨大的彩虹表的兴起,作为一种完全混淆存储密码的方式,它不是100%可靠。

更好的方法是在密码到达数据库之前对密码进行哈希处理(使用salt)。例如:

<?php
$password = sha1(SALT.$_POST["password"]);
$sql = "UPDATE users SET password='".$password."' WHERE id=54";
?>

答案 3 :(得分:0)

简介 无需太过技术和数学上的细节,可能有必要稍微解释一下加密散列咸化之间的区别。

加密 加密已经存在了很长时间。埃及人用它来创造神秘和娱乐,而罗马人用它来发送秘密信息。加密密码时,您将应用某种加密算法。应用密钥,对其进行解密。

ROT13是加密算法的简单示例。它基本上将每个字母替换为字母表中的13个位置。

不要喝酒。     = Qba'g qevax gur jvar。 ROT13显然是一个很弱的算法,但是在这里说明关键点很有用-加密数据是可逆的。就像是设计使然。如果另一端的人无法解密,则加密秘密消息毫无意义。因此,它对于信用卡号或电子邮件之类的东西很有用。您正在阅读此内容的Web浏览器也正在使用加密。

服务器对数据进行加密,然后通过安全的SSL连接将其发送到您的浏览器,然后将其解密以便您可以读取。

散列 哈希与加密的不同之处在于,一旦对数据进行编码,就无法对其进行解码。好吧,至少这样做非常困难。与加密不同,输出始终是固定长度的,具体取决于您使用的算法。

使用之前的短语,然后得到MD5算法...

不要喝酒。     = b290557177ec5dd7098d1de84616dd04 如果我们尝试更长的短语...

请不要喝葡萄酒,它的味道很糟。     = fd870b20869d9ae05d84e3d7fbed0c94 您将看到结果长度相同。这意味着,多个输入可能会产生相同的输出,称为 collission

在存储不需要读回但需要检查的内容时,散列很有用。密码是主要示例。而不是存储明文,而是存储哈希版本。然后,当有人输入密码时,您将应用相同的哈希算法,并将其与数据库中的密码进行比较。如果它们匹配,则门将打开。

哈希函数还可以用于测试信息是否被篡改。发送电子邮件时,您首先要共享一个只有您和收件人知道的秘密值。在发送电子邮件之前,请使用您的秘密值对其进行签名并产生哈希值。然后发送您的明文电子邮件(不包含秘密值)以及哈希值。然后,您的朋友可以执行相同的过程,如果哈希值相同,那么他们知道您的消息在此过程中并未被篡改。此技术称为消息身份验证代码或基于哈希的消息身份验证代码。

散列算法的重要因素是它们只能以一种方式工作。求出原始值的唯一方法是蛮力。尝试多个值以查看它们是否产生相同的哈希值。

这对于通常较短且使用常用单词的密码来说尤其成问题。现代计算机花很长时间才能浏览大型词典(或使用现有的Rainbow表)并弄清楚每个常用密码的哈希结果。

那就是加盐的地方。

盐腌 除了阻塞您的动脉之外,盐还可能堵塞任何试图破解哈希密码的人。它们的工作方式是在输入的末尾添加一个额外的秘密值,从而延长了原始密码的长度。

说您的密码不正确,盐值是i.love.salt。哈希值将由这两个共同构成的rockyi.love.salt组成。这为使用常用词作为密码的人们提供了一些保护。但是,如果有人得知您使用的盐值,则只需将其添加到他们尝试进行攻击的每个词典单词的末尾(或开头)。

要使此操作更困难,可以使用随机盐,每个密码一个。它显然需要存储在与用户帐户匹配的某个位置的数据库中,但这确实使暴力攻击更加困难。最后,您可以从多个部分创建盐,可以使用当前日期时间,用户名,秘密短语,随机值或所有这些的组合。