我想确认 MySQL 是否使用 SHA1 进行“PASSSWORD”散列以及为什么下面的测试不起作用:
mysql> GRANT USAGE ON *.* TO 'test'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> SELECT user,host,password FROM mysql.user WHERE user='test';
+------+------------+-------------------------------------------+
| user | host | password |
+------+------------+-------------------------------------------+
| test | localhost | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
+------+------------+-------------------------------------------+
1 row in set (0.01 sec)
mysql> \q
Bye
[root@test ~]# echo -n "password" | sha1sum | awk '{print toupper($1)}'
5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8
MySQL 文档Encryption and Compression Functions页面具有可用于散列密码的各种函数。它还明确指出:
至于另一个问题,您可以在 SQL-Fiddle 测试(
PASSWORD()
至少在我们可以在 SQL-Fiddle 测试的版本 5.1、5.5 和 5.6 中)被实现为在提供的字符串上应用SHA1()
两次:感谢 Rene Cannao,他深入研究了源代码并在博客文章中提供了答案:PalominoDB.com:MySQL PASSWORD() 中的哈希算法
在 StackOverflow 上还有一个相关的旧答案:Simulating MySql's password() encryption using .NET or MS SQL
如果您想使用 Linux CLI 进行确认,只需在 Ubuntu 上进行测试:
它不是加密,而是散列,这是不同的。
MD5 和 SHA-1 均已损坏且易受攻击,您不应将它们用于密码散列。使用 BCrypt。
MD5被认为是有害的
SHA-1 损坏