Postfix + MySQL ENCRYPT (), как он проверяет пароль с помощью рандомизированной соли? - PullRequest
2 голосов
/ 07 января 2011

Я реализовал свой почтовый сервер так, как продиктовано здесь .

Он прекрасно работает.Мое любопытство вращается вокруг ввода пользователей в базу данных и их аутентификации

Запуск:

INSERT INTO users (email, password) VALUES ('sales@example.com', ENCRYPT('password'));

Несколько раз будет выдан другой хэш для зашифрованного пароля, который использует случайную соль.Т.е. если я введу sales@example.com три раза с одним и тем же паролем, каждый хэш будет разным ...

У меня такой вопрос: как получается, что сервер Postfix может на самом деле аутентифицировать пароль, когда пользователь входит в систему?через почтовый клиент?

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

Ответы [ 3 ]

3 голосов
/ 03 октября 2012

Postfix сравнивает пароль из базы данных с новым шифрованием, выполненным с помощью соли (пароль из db).

для шифрования:

update user set password = ENCRYPT('1234') where id = 1

для проверки пароля:

SELECT u.* FROM user u where u.email ='admin@dominio.com' 
and ENCRYPT('1234', u.password) = u.password
2 голосов
/ 11 февраля 2011

Прочитайте man crypt: он возвращает соль в первых двух символах возвращаемого значения.

Таким образом, соль не теряется, вы можете сравнить зашифрованную строку с результатом crypt ('pass', $ first_two_chars_of_encrypted_value).

0 голосов
/ 07 января 2011

Вы должны использовать ENCRYPT ('pass', 'salt'), чтобы заставить соль, иначе соль будет потеряна навсегда, и у вас нет способа ее восстановить. Довольно бессмысленная функция без нее. Это ужасная функция, потому что безопасность настолько минимальна; используйте вместо него ПАРОЛЬ () или OLD_PASSWORD ().

ENCRYPT () использует системную функцию crypt (), которая может использовать все или только первые 8 символов, должна быть печатной 7-битной ASCII, обычно использует 1 раунд хэша на основе DES и полностью не переносима. Избегайте этого.

...