Это bcrypt:
Генерация случайной соли.Коэффициент стоимости был предварительно настроен.Соберите пароль.
Извлеките ключ шифрования из пароля, используя соль и коэффициент стоимости.Используйте его для шифрования известной строки. Магазин стоимость, соль, и зашифрованный текст.Поскольку эти три элемента имеют известную длину, их легко объединить и сохранить в одном поле, но потом можно будет разбить их на части.
Когда кто-то пытается аутентифицироваться, извлекает сохраненную стоимость и соль.Получите ключ от ввода пароля, стоимости и соли.Зашифруйте ту же самую известную строку.Если сгенерированный зашифрованный текст совпадает с сохраненным зашифрованным текстом, пароль совпадает.
Bcrypt работает очень похоже на более традиционные схемы, основанные на алгоритмах, подобных PBKDF2.Основным отличием является использование производного ключа для шифрования известного простого текста;другие схемы (разумно) предполагают, что функция получения ключа является необратимой, и сохраняют полученный ключ напрямую.
Сохраненный в базе данных, bcrypt
"хеш" может выглядеть примерно так:
$ 2a $ 10 $ vI8aWBnW3fID.ZQ4 / zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa
На самом деле это три поля, разделенные символом "$":
10
- коэффициент стоимости;Используются 2 10 итерации функции вывода ключа (кстати, этого недостаточно. Я бы рекомендовал стоимость 12 или более). vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa
- сольи зашифрованный текст, объединенный и закодированный в модифицированной Base-64.Первые 22 символа декодируются до 16-байтового значения для соли.Остальные символы - это зашифрованный текст, который нужно сравнить для проверки подлинности.
Этот пример взят из документации для реализации Ruby в Coda Hale.