mysql - 为什么 MySQL 的 ENCRYPT 在每次调用时返回不同的结果?

标签 mysql linux unix hash crypt

我有一个 ugly server issue ,我尽量不忽略这方面的任何细节。

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

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

最佳答案

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

关于mysql - 为什么 MySQL 的 ENCRYPT 在每次调用时返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5662130/

相关文章:

Ruby 中的 MySQL SQL/DDL 解析器/验证器(on Rails)

linux - unix shell脚本合并多行

unix - mmap 超出文件末尾

unix - 用于从 .gz 文件中删除字符串的 Shell 脚本

Mysql 解释显示查询正在使用索引,而根据 Mysql 文档,它不应该使用索引

php - 关键字搜索表

linux - 复制所有 ".classpath"文件的linux命令是什么?

c - windows上的unix系统编程项目?

Mysql创建触发器语法错误使用DELIMITER $$

linux - 如何删除多个目录中的文件名linux