crypt() 在不同的机器上

fab*_*rik 2 password debian mysql

由于硬件问题,我需要将许多虚拟用户迁移到新机器上。他们的密码存储在 MySQL 中ENCRYPTcrypt()最终使用哪个加密。

也许这是我的错,但salt 在存储密码时没有添加,所以它们是完全随机的。我的基本想法是转储数据库然后导入它。当我尝试将相同的字符串存储在同一台机器中时,ENCRYPT它给了我不同的结果。用户的密码在新机器上有效吗?

更新环境和加密方法:

  • 旧机器正在运行带有 MySQL 5.0 的 Debian Etch
  • 新机器将运行带有 MySQL 5.1 的 Debian Squeeze
  • 加密方式为MySQL默认 ENCRYPT
  • 最初没有加盐
  • 我不知道密码

感谢您的反馈,fabrik

for*_*sck 8

从提供的链接到 ENCRYPT()

如果没有给出 salt 参数,则使用随机值。

salt是一个2字符的字符串,保存在密文的开头。例如,使用 salt='df' 加密字符串,'df' 位于输出产品的开头。

mysql> SELECT ENCRYPT('hello','df');
+-----------------------+
| ENCRYPT('hello','df') |
+-----------------------+
| dfbVa429UeC0U         | 
+-----------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

另一个例子,没有 salt

mysql> SELECT ENCRYPT('hello');
+------------------+
| ENCRYPT('hello') |
+------------------+
| oBSydDfeNx5ug    | 
+------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

现在使用前一个字符串的前两个字符作为 salt

mysql> SELECT ENCRYPT('hello','oB');
+-----------------------+
| ENCRYPT('hello','oB') |
+-----------------------+
| oBSydDfeNx5ug         | 
+-----------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

相同的输出。

您很可能不会遇到问题,但为了 100% 确定(crypt 实现是相同的),在旧机器上创建一个测试帐户并将其迁移到新机器。检查密码是否适用于他们两个。

编辑:

salt总是存储在口令的加密字符串的第一个字母。有NO WAY salt丢失,没有salt用户将无法登录你的旧机器摆在首位。您不需要(也不应该)知道任何密码。

如果您要从 etch 迁移到 Squeeze,最明智的方法是使用 Debian Squeeze 设置测试服务器。你不需要硬件来做到这一点,例如设置一个 VirtualBox 来宾。然后在你的旧机器上新建一个用户,把他的账号迁移到测试机上。如果密码对两台机器都有效,那么您就可以开始使用了,这是确保 99.9% 确定的唯一方法。无论如何,测试迁移是必须的,您应该担心它们中出现的更多问题。