为什么MySQL的ENCRYPT在每个调用中返回不同的结果?

我有一个丑陋的服务器问题 ,我试图不要忽略任何细节。

我的虚拟邮件用户密码与MySQL的ENCRYPTfunction一起存储。 我的基本想法是将我的虚拟用户的表从旧机器转储,然后导入到新的。

只是为了仔细检查,我试图再次用ENCRYPT存储一个string,并且存储的数据是不同的。 这是否意味着我不能像我想的那样简单地导出/导入用户?

Datajam已经描述的是正确的。 这里有一些进一步的解释。

如果你不给ENCRYPT()函数提供一个salt,那么将会生成一个随机的文件并用来加密字符串。 盐只是两个字节/字符。

首先,我将演示如果使用相同的字符串运行两次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) 

使用这些信息,你应该尝试运行两个MySQL服务器的ENCRYPT()函数,指定相同的盐,你应该得到相同的结果。 如果不是那么crypt()的实现可能会在两者之间变化。

我知道这是一个旧的帖子,但如果你有类似的问题,你不需要重建所有的加密密码。 盐是前两个字符。

为了这个原因,加密函数很可能会使输入具有随机值 – 对两次相同的数据进行加密以提供不同的密文。

MySQL的ENCRYPT()函数有一个可选的第二个参数来定义散列算法使用的salt。 如果你不提供盐,那么结果将是不同的,即使是相同的输入字符串。

如果您正在迁移数据库并希望保留相同的散列,请确保您也使用相同的salt值。 ENCRYPT()应该使用相同的输入字符串和盐值给出相同的结果。