sha512-крипта mysql и голубятня

У меня есть вопрос о понимании хэширования SHA512-crypt. Я нашел это учебник для настройки dovecot и postfix с mysql. Я следил за учебником (с небольшими изменениями), и все работает нормально. Но есть одна вещь,которую я не понимаю:--4-->

Добавить пользователя, я должен использовать:

INSERT INTO `mailserver`.`virtual_users`
  (`id`, `domain_id`, `password` , `email`)
VALUES
  ('1', '1', ENCRYPT('firstpassword', CONCAT('$', SUBSTRING(SHA(RAND()), -16))),    'email1@example.com'),
  ('2', '1', ENCRYPT('secondpassword', CONCAT('$', SUBSTRING(SHA(RAND()), -16))), 'email2@example.com');

и опять же, это работает отлично, т. е. я могу войти в систему с моим паролем (и только моим паролем) в dovecot. Но почему? Если я правильно понимаю, это ... шифрует пароль с помощью случайной соли, но не сохраняет его нигде. Поэтому хэширование одного и того же пароля дважды дает мне 2 разных хэша (я пробовал). Поэтому мой вопрос сводится к: Могу ли я получить краткое объяснение sha-512 (которое я не мог найти в интернете) и объяснить, почему эти строки работают?

спасибо уже

1 ответов


соль сохраняется как часть пароля. Например, вызов:

ENCRYPT('firstpassword', CONCAT('$', 'FooBarBaz')) 

дает

$6$FooBarBaz$.Т. г. 7FRJqZ6N2FF7b3BEkr5j37CWhwgvPOOoccrr0bvkbbnmmlcxzqqqkjbnhnhc.583dTBLEuZcDuQe7NEe.

Это хранит как используемый алгоритм (6 - SHA512), так и соль ('FooBarBaz'), обе делинированные $.

Edit: для проверки пароля вы можете использовать:

password = ENCRYPT('user_input', `password`)

ENCRYPT схватит соль от, который хранят пароль и используйте это при проверке user_input.

полный кредит hek2mgl для проверки пароля он подробно в ответ.