MySQL密码功能

Wes*_*Wes 16 mysql passwords

使用MySQL的密码函数来散列应用程序使用的密码是否被视为好或坏的做法?我可以看到利弊.我很好奇是否对它的好坏有一个普遍的共识.

Bil*_*win 23

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

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

阅读" 您可能错误存储密码 ",以获得有关散列和存储密码的更好建议.

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

我为MySQL提供了一个补丁来支持一个SHA2()功能,补丁被接受了,但是由于他们的路线图已经改变,所以不清楚什么时候它会成为一个发布的产品.

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

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


dav*_*vek 10

如果您使用数据库函数来散列密码,那么根据定义,它们必须未加入到数据库中:我更愿意更接近"源",即在前端应用程序中,因此您不会传递暴露的信息.

  • +1 salting和散列帐户密码是一个应用程序问题,而不是你想要依赖于DBMS的特定实现. (7认同)

dav*_*gr8 6

我相信PASSWORDMySQL中的实际功能是不安全的,并且已被破坏,但我目前找不到链接.我知道较旧的(OLD_PASSWORD5 岁及以上)肯定是不安全的.

当然,所有密码应始终与盐一起存储(为了进一步默默无闻).例:

UPDATE users SET password=MD5(CONCAT('salt', 'user provided value')) WHERE id=54
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 查看password.c的代码,MySQL 4.1+密码只需将SHA1应用于输入两次(无盐)并转换为十六进制字符串即可编码. (4认同)