Почему MySQL ENCRYPT возвращает разные результаты при каждом вызове? - PullRequest
3 голосов
/ 14 апреля 2011

У меня ужасная проблема с сервером , и я стараюсь не упускать из виду какие-либо подробности об этом.

Пароли пользователей моей виртуальной электронной почты хранятся с функцией MySQL ENCRYPT. Моя основная идея состояла в том, чтобы выкинуть таблицу своих виртуальных пользователей со старой машины, а затем импортировать ее на новую.

Просто для двойной проверки я попытался снова сохранить строку с ENCRYPT, и сохраненные данные были другими. Означает ли это, что я не могу экспортировать / импортировать своих пользователей просто, как я думал?

Ответы [ 4 ]

5 голосов
/ 14 апреля 2011

То, что 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 голос
/ 11 февраля 2013

Я понимаю, что это старый пост, но если у вас есть похожая проблема, вам не нужно перестраивать все зашифрованные пароли.Соль первых двух символов.

0 голосов
/ 14 апреля 2011

Функция MySQL ENCRYPT() имеет необязательный второй аргумент для определения соли, используемой алгоритмом хеширования. Если вы не предоставите соль, результат будет другим даже для одной и той же входной строки.

Если вы переносите базу данных и хотите сохранить те же хеши, просто убедитесь, что вы также используете то же значение соли. ENCRYPT() должен давать тот же результат с той же входной строкой и значением соли.

0 голосов
/ 14 апреля 2011

Вполне вероятно, что функция ENCRYPT солит ввод случайным значением именно по этой причине - вы хотите дважды зашифровать одни и те же данные, чтобы получить другой зашифрованный текст.

...