2009-11-17 50 views
15

使用MySQL的密码函数来散列应用程序使用的密码是否被认为是好的或不好的做法?我可以看到优点和缺点。我很好奇,究竟是好还是坏,是否有共识。MySQL密码函数

回答

21

为MySQL的PASSWORD()功能状态的文档:

密码()函数是用来通过在MySQL服务器的认证系统;你不应该在你自己的应用程序中使用它。

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

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

我向MySQL提供了一个补丁来支持SHA2()函数,并且该补丁已被接受,但是由于他们的路线图已经发生变化,所以尚不清楚它何时会将其发布到发布的产品中。

在此期间,您可以使用散列和程序语言的盐析,并简单地将结果存储哈希数据库中的消化。如果您使用PHP,则可在hash()函数中使用SHA-256。

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

+0

这个帖子的任何更新,如果SHA2()仍然是最新的替代密码功能? Thx – Charlesliam 2015-04-01 06:16:29

+1

@Charlesliam,检查bcrypt,scrypt或PBDKF2。 – 2015-04-01 06:55:18

10

如果您使用的是数据库函数的定义来散列密码,那么他们必须在散列的数据库到达:因此,我要喜欢做它更接近“源”,即在前端应用程序,你不及格围绕暴露的信息。

+7

+1 salting和散列帐户密码是一个应用程序问题,而不是您想要依赖于DBMS的特定实现。 – bobince 2009-11-17 19:30:59

+0

单词,这不是你想用的东西。看看OLD_PASSWORD和MySQL改变哈希方法时发生的PITA。在应用程序中做得更好,imo。 – jeffcook2150 2009-11-17 20:16:47

6

我相信在MySQL实际PASSWORD功能是不安全的,并已被打破,但我找不到此刻的链接。我知道年龄较大(5岁以上的OLD_PASSWORD)绝对不安全。

当然,所有的密码都应该始终用盐存储(为了进一步隐藏)。例如:

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

也有MD5功能,但与巨大的彩虹表的兴起,它不是100%可靠的,完全混淆存储的密码的方式。

一个更好的方法是在密码到达数据库之前对它进行散列(用盐)。例如:

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

查看password.c的代码,MySQL 4.1+密码仅通过将SHA1应用于输入两次(无盐)而编码,并转换为十六进制字符串。 – 2009-11-17 19:56:39

+0

正常的散列不应该用于密码存储(它仍然比纯文本好很多),您应该使用bcrypt或其他密钥派生函数,而这种函数对蛮力攻击的抵抗力要强大得多。 – 2015-10-15 13:06:10

+0

我认为它应该sha1两次?参考:http:// stackoverflow。com/questions/17766978/mysql-password-function-to-php – zx1986 2016-06-22 06:02:46