如何在MySQL中进行密码哈希?

12

如何使用单个查询使用户表中的每个密码都加密(使用md5()),除了一个特定的行?


5
好的,MD5不是加密算法,而是哈希函数。你无法解密它。 - unbeknown
6个回答

18
UPDATE table SET Password = MD5(Password)

我必须说,MD5不是一种很好的加密级别,你应该考虑使用更强的加密方式,比如使用自定义盐的ENCRYPT。在这里了解更多信息

编辑:看起来原问题已经改变。以下是修改后的查询以适应。

UPDATE table SET Password = MD5(Password) WHERE ID!=[specified index]

编辑:值得注意的是

MD5加密已被破解


1
除了被黑客攻击了,它还好 http://www.gearfuse.com/md5-algorithm-hacked-by-playstation-3-cluster/ - jerebear
如果密码是使用带盐的md5()加密的呢?再加盐呢?还能被破解吗? - codingbear
2
“Hacked”链接与密码验证毫不相关。我希望人们在不了解实际漏洞的情况下停止称MD5为“已破解”。 - Chad Birch
1
当然可以,你只需要将盐字符串连接到密码的前面/后面。这就是MD5加盐的原理。 - Chad Birch
现在是2015年!应避免使用MD5。 - Alex Jones
显示剩余4条评论

7

MySQL中的哈希函数

在MySQL数据库中,存储密码时可以使用许多比MD5更好的哈希函数。
您可以在MySQL :: 11.10.2. Encryption and Compression Functions上找到它们的列表。

保存密码(哈希):

UPDATE users SET password = SHA('secret_password') WHERE ....;

检查密码:

SELECT COUNT(*) FROM users WHERE name = 'username' && password = SHA('typed_password');

如果结果 > 0,则表示用户提供了正确的密码。


5

在哈希密码时,不要忘记加盐,这样相同的密码就不会产生相同的哈希值:

SET @salt := CONV(FLOOR(RAND() * 0x100000000), 10, 16)

UPDATE  passwords
SET     password = CONCAT(@salt, SHA(CONCAT(@salt, @typed_password)))

SELECT  1
FROM    passwords
WHERE   SHA(CONCAT(SUBSTRING(password, 1, 8), @typed_password)) = SUBSTRING(password, 9, 40)

你需要用零填充你的salt:LPAD(@salt, 8, '0'); - lzm

3

针对原帖的编辑做出的回应。

UPDATE userTable
SET password = MD5(password)
WHERE NOT (<criteria to identify row to exclude>)

2
现在是2015年!应该避免使用MD5。 - Alex Jones
同意。https://security.stackexchange.com/a/31846/29869 && https://security.stackexchange.com/a/19908/29869 - JayRizzo

3
关于您的编辑:您是否有一个标识此行的ID或用户名?
UPDATE mytable
SET password = MD5(password)
WHERE id <> 123

现在是2015年!应避免使用MD5。 - Alex Jones

2

我认为这个更新有点更加现代化。

SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('newpass');

或者

UPDATE user SET  password = PASSWORD('newpass');

希望这能帮到你。

更好的方法是结合@Quassnoi的答案,使用每个密码的存储盐和服务器范围内的胡椒粉。 "UPDATE user SET password = PASSWORD(CONCAT(salt, typed_password, pepper))" - Bas Goossen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接