До цього дня дуже багато зберігають паролі в базі просто захешіровав їх за допомогою md5 або в кращому випадку SHA-1, що навряд чи забезпечує скільки-небудь помітну безпеку. У застарілого і вже визнаного ненадійним md5 існує чимало колізій, а також до нього розраховані досить великі і загальнодоступні райдужні таблиці. Ситуація з SHA-1 лише трохи краще.
Використання солі і більш стійких алгоритмів хешування значно збільшують надійність, однак рассчет навіть довгих хешів - не дуже складне завдання для сучасних систем, особливо з тих пір як для розрахунком стали залучати GPU. Тому для збільшення надійності шифрування паролів слід використовувати такий алгоритм, який буде працювати настільки повільно, що рассчет райдужних таблиць і атаки методом перебору стануть абсолютно неефективними. Це робить відома функція bcrypt. Для незворотного шифрування вона використовує алгоритм blowfish з безліччю ітерацій, і працює дуже повільно. Шляхом зміни кількості ітерацій можна регулювати час, що витрачається на шифрування пароля, і знайти таку «золоту середину», коли шифрування одного пароля буде досить швидким, а підбір його стане безглуздим.
У PHP є вбудована функція crypt (), що є реалізацією bcrypt. З версіях PHP 5.3 і вище функція crypt () має вбудовану реалізацію алгоритмів шифрування і більше не залежить від підтримки цих алгоритмів операційною системою, ніж та слід скористатися. Ця функція підтримує різні алгоритми, від DES до SHA-512, і вибирає алгоритм залежно від того, яка сіль задається в якості її параметра.
Нижче я хочу запропонувати найпростіший, що складається з одного рядка генератор солі. Будучи згодованих функції crypt () дана сіль змусить її використовувати blowfish з 10 в квадраті ітерацій. Це задається ідентифікатором $ 2a $ (використовувати bcrypt), і що йде потім кількістю ітерацій, які задаються як логарифм за основою 2 (в даному випадку це 2 10. тобто 1024 ітерацій. Збільшення параметра на одиницю подвоює кількість ітерацій, і отже час розрахунком функції .
Сіль буде довжиною 30 байт, з яких 22 корисних і 8 службових. На моєму сервері (Xeon E5520, 2.24 ГГц) рассчет одного пароля таким способом займає 0.12 секунд - що дуже багато. На виході буде отримана рядок довжиною 60 байт.