由于硬件问题,我需要迁移许多虚拟用户到新机器。他们的密码存储在 MySQL 中,并使用以下方式加密ENCRYPT
最终使用crypt()
。
也许这是我的错,但salt
在存储密码时没有添加,所以它们是完全随机的。我的基本想法是转储数据库然后导入它。当我尝试将相同的字符串存储在同一台机器中时,ENCRYPT
它给了我不同的结果。用户的密码可以在新机器上使用吗?
环境和加密方法更新:
- 旧机器运行 Debian Etch 和 MySQL 5.0
- 新机器将运行 Debian Squeeze 和 MySQL 5.1
- 加密方式是MySQL默认的
ENCRYPT
- 原来没有加盐
- 我不知道密码
感谢您的反馈,法布里克
答案1
从提供的链接到ENCRYPT()
如果没有给出 salt 参数,则使用随机值。
salt
是一个 2 个字符的字符串,保存在加密文本的开头。例如,使用 salt='df' 加密字符串,'df' 位于输出产品的开头。
mysql> SELECT ENCRYPT('hello','df');
+-----------------------+
| ENCRYPT('hello','df') |
+-----------------------+
| dfbVa429UeC0U |
+-----------------------+
1 row in set (0.00 sec)
再举个例子,没有salt
mysql> SELECT ENCRYPT('hello');
+------------------+
| ENCRYPT('hello') |
+------------------+
| oBSydDfeNx5ug |
+------------------+
1 row in set (0.00 sec)
现在使用前一个字符串的前两个字符作为salt
mysql> SELECT ENCRYPT('hello','oB');
+-----------------------+
| ENCRYPT('hello','oB') |
+-----------------------+
| oBSydDfeNx5ug |
+-----------------------+
1 row in set (0.00 sec)
相同的输出。
您很可能不会遇到问题,但为了 100% 确定(加密实现是相同的),请在旧计算机上创建一个测试帐户并将其迁移到新计算机。检查密码是否适用于他们两个。
编辑:
salt
是总是存储在密码加密字符串的第一个字母中。有决不 salt
丢失了,如果没有,salt
用户首先将无法登录您的旧计算机。您不需要(也不应该)知道任何密码。
如果您要从 etch 迁移到 scrape,最明智的方法是使用 Debian Squeeze 设置测试服务器。您不需要硬件来执行此操作,例如设置 VirtualBox guest 虚拟机。然后在旧机器上创建一个新用户并将其帐户迁移到测试机器上。如果密码对两台机器都有效,那么您就可以开始了,这是 99.9% 确定的唯一方法。无论如何,测试迁移是必须的,您应该担心其中出现更多问题。