3

我有一个丑陋的服务器问题,我尽量不要忽略这方面的任何细节。

我的虚拟电子邮件用户的密码存储在 MySQL 的ENCRYPT功能中。我的基本想法是我将从旧机器中转储我的虚拟用户表,然后将其导入新机器。

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

4

4 回答 4

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() 的实现可能在两者之间有所不同。

于 2011-04-14T12:13:37.810 回答
1

我知道这是一篇旧帖子,但如果您遇到类似问题,则无需重建所有加密密码。盐是前两个字符。

于 2013-02-11T09:02:07.543 回答
0

出于这个原因,ENCRYPT 函数很可能会用随机值对输入进行加盐 - 您希望对相同的数据进行两次加密以提供不同的密文。

于 2011-04-14T11:01:52.653 回答
0

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

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

于 2011-04-14T11:12:24.693 回答