Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么MySQL';s加密在每次调用时返回不同的结果?_Mysql_Linux_Unix_Hash_Crypt - Fatal编程技术网

为什么MySQL';s加密在每次调用时返回不同的结果?

为什么MySQL';s加密在每次调用时返回不同的结果?,mysql,linux,unix,hash,crypt,Mysql,Linux,Unix,Hash,Crypt,我有一个秘密,我尽量不忽略任何细节 我的虚拟电子邮件用户密码是通过MySQL的功能存储的。我的基本想法是从旧机器中转储虚拟用户表,然后将其导入新机器 为了进行双重检查,我再次尝试使用ENCRYPT存储字符串,但存储的数据不同。这是否意味着我不能像我所想的那样简单地导出/导入我的用户?很可能正是出于这个原因,加密函数用一个随机值对输入进行加密-您希望对相同的数据加密两次,以给出不同的密文。MySQL的ENCRYPT()函数有一个可选的第二个参数,用于定义哈希算法使用的salt。如果您不提供salt

我有一个秘密,我尽量不忽略任何细节

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


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

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

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


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

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

如果未向
ENCRYPT()
函数提供salt,则将生成一个随机salt,并用于加密字符串。salt只有两个字节/字符

首先,我将演示如果使用同一字符串运行两次
ENCRYPT()
,它将给出不同的值(因为随机盐不同)

现在,如果我使用最后一个条目并再次尝试
ENCRYPT()
,使用已经作为salt的值,我们将得到相同的结果:

mysql> SELECT ENCRYPT('hello', '7QHPY3iSLVdas');
+-----------------------------------+
| ENCRYPT('hello', '7QHPY3iSLVdas') |
+-----------------------------------+
| 7QHPY3iSLVdas                     | 
+-----------------------------------+
1 row in set (0.00 sec)
只是为了证明如果我们用同样的盐把字符串(密码)弄错了,我们会得到不同的值。请注意,在本例中,前两个字符(仅为salt)保持不变

mysql> SELECT ENCRYPT('helloX', '7QHPY3iSLVdas');
+------------------------------------+
| ENCRYPT('helloX', '7QHPY3iSLVdas') |
+------------------------------------+
| 7QKDSis4DZnCU                      | 
+------------------------------------+
1 row in set (0.01 sec)

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

我知道这是一篇老文章,但如果您有类似的问题,则不需要重新生成所有加密的密码。salt是前两个字符。

使用Unix crypt()系统调用加密str并返回二进制字符串。
-您的问题可能是
crypt()
的输出是否因系统而异,或者从一个发行版到另一个发行版。@Pekka我只是读了手册上的内容,但是当我在同一台机器上尝试两次相同的字符串时,它给了我不同的结果。对不起,我的知识贫乏,但电子邮件是盒子上最重要的服务,所以我应该非常谨慎。啊!我自己对
crypt()
几乎一无所知,所以我无法回答这个问题。也许再添加一些标签来吸引合适的人
Linux
Unix和
crypt
浮现在脑海中。@Pekka谢谢你的提示,希望能有所帮助。是的。你可以考虑询问,如果没有任何东西出现,当密码被存储时,不会添加盐。(感谢您的回答,但不幸的是,存储密码时没有添加salt。@James C不幸的是,我不知道什么是
hello
,这是我的问题。我不想解密这些加密字符串,但我想确保我新导入的数据库将接受原始密码。如果您运行
ENCRYPT('foo','bar')
在两台服务器上,并在两台服务器上接收相同的值,然后旧密码将在新机器上工作。@James C salt最初没有添加,因此加密字符串是随机的。看起来什么都没有了,但构建多维数据集,然后再试一次。谢谢你,James。请仔细阅读本文。“如果不向ENCRYPT()函数提供salt,则会生成一个随机的salt,用于加密字符串。salt仅为两个字节/字符。“。salt显示为存储在数据库中的加密字符串的前两个字符。@James C这一部分现在基本清楚了。但由于我对用户密码一无所知,因此无法将其导入新数据库。或者我误解了什么?
mysql> SELECT ENCRYPT('helloX', '7QHPY3iSLVdas');
+------------------------------------+
| ENCRYPT('helloX', '7QHPY3iSLVdas') |
+------------------------------------+
| 7QKDSis4DZnCU                      | 
+------------------------------------+
1 row in set (0.01 sec)