我有一个ugly server issue,我不想忽视任何细节。
我的虚拟电子邮件用户密码存储在MySQL的ENCRYPT
功能中。我的基本想法是我将从旧机器中转储我的虚拟用户表,然后将其导入新机器。
只是为了仔细检查,我尝试再次存储带有ENCRYPT
的字符串,并且存储的数据不同。这是否意味着我不能像我想的那样导出/导入我的用户?
答案 0 :(得分:5)
Datajam已经描述的内容是正确的。这里有一些进一步的解释。
如果您不向ENCRYPT()
函数提供盐,则会生成一个随机的盐并用于加密字符串。盐只有两个字节/字符。
首先,我将演示如果我使用相同的字符串运行ENCRYPT()
两次,它会给出不同的值(因为随机盐不同)
mysql> SELECT ENCRYPT('hello');
+------------------+
| ENCRYPT('hello') |
+------------------+
| 5Q5CiJWj4GItY |
+------------------+
1 row in set (0.02 sec)
mysql> SELECT ENCRYPT('hello');
+------------------+
| ENCRYPT('hello') |
+------------------+
| 7QHPY3iSLVdas |
+------------------+
1 row in set (0.00 sec)
现在,如果我使用最后一个条目并再次使用我们已经作为盐的值再次尝试ENCRYPT()
,我们将得到相同的结果:
mysql> SELECT ENCRYPT('hello', '7QHPY3iSLVdas');
+-----------------------------------+
| ENCRYPT('hello', '7QHPY3iSLVdas') |
+-----------------------------------+
| 7QHPY3iSLVdas |
+-----------------------------------+
1 row in set (0.00 sec)
只是为了证明如果我们得到相同盐的字符串(密码)错误,我们将获得不同的值。请注意,在此示例中,两个第一个字符(只是盐)保持不变。
mysql> SELECT ENCRYPT('helloX', '7QHPY3iSLVdas');
+------------------------------------+
| ENCRYPT('helloX', '7QHPY3iSLVdas') |
+------------------------------------+
| 7QKDSis4DZnCU |
+------------------------------------+
1 row in set (0.01 sec)
使用此信息,您应该尝试运行ENCRYPT()
函数,同时指定相同的两个MySQL服务器,您应该得到相同的结果。如果没有,那么crypt()的实现可能会在两者之间有所不同。
答案 1 :(得分:1)
我知道这是一个旧帖子,但如果您遇到类似问题,则无需重建所有加密密码。盐是前两个字符。
答案 2 :(得分:0)
由于这个原因,ENCRYPT函数可能会使用随机值对输入进行加盐 - 您想要两次加密相同的数据以提供不同的密文。
答案 3 :(得分:0)
MySQL的ENCRYPT()
函数有一个可选的第二个参数来定义散列算法使用的salt。如果您不提供salt,那么结果将会有所不同,即使对于相同的输入字符串也是如此。
如果要迁移数据库并希望保留相同的哈希值,请确保使用相同的salt值。 ENCRYPT()
应该使用相同的输入字符串和salt值给出相同的结果。