Для многих данных механизм не секрет, а уж если взять специалистов по сетевой безопасности, так то вообще всем поголовно известно, но всё же считаю нужным описать этот алгоритм дабы всегда можно было быстро вспомнить если вдруг забыл. Скажу сразу, что этот механизм шифрования паролей стар как мир, но при этом весьма надёжен и актуален по сей день, что является доказательством его успешности. Этот механизм шифрования паролей пользователей исторически и по сей день применяется в большинстве дистрибутивов ОС Linux.
О чём речь?
Разумеется, все знают, что хранить пароли в открытом виде это страшное зло и не в коем случае нельзя так делать в боевых проектах, даже в не больших. Пароли всегда надо шифровать! Дело лишь в том какой алгоритм шифрования выбрать, ведь их огромное множество и глаза разбегаются.
Суть в том, что любой пароль можно взломать, вопрос лишь во времени и затраченных силах, но это не снимает с вас ответственности за своих пользователей и не освобождает от работы криптографии.
Как шифровать пароль
Существует огромное множество различных алгоритмов шифровки паролей и каждый создатель уверен, что у него он самый лучший и надёжный. На своей практике я встречал случаи когда люди обходились лишь одним только хэшированием строки как-нибудь односторонним алгоритмом вроде md5. Многие так же любят добавлять к исходной строке пароля перед хешированием различные случайные префиксы и постфиксы. В общем методов масса и не известно кокой лучше. Эти споры можно продолжать бесконечно, но мы поговорим об известном всем, проверенным временем алгоритме по типу шифровки в Linux. Собственно он и состоит из добавления соли (случайной строки) к паролю и циклическому хэшированию несколько раз.
Алгоритм шифрования
К первоначальной строке пароля добавляем соль, далее хэшируем получившийся результат и так в делаем в цикле несколько раз. Таким образом всё предельно просто и в то же время достаточно надёжно.
Ниже представлен вариант простейшей функции реализовывающей данный метод шифрования пароля, на языке PHP:
[php]
function getHash($string, $salt, $iterationCount) {
for ($i = 0; $i < $iterationCount; $i++)
$string = sha1($string . $salt);
return $string;
}
[/php]
Вот собственно и весь алгоритм, весьма надёжно, строго и сердито, проверено временем.
В БД храним имя пользователя, конечный hash его пароля, а так же соль и количество итераций. Все перечисленные значения строго уникальны для каждого отдельно взятого пользователя. Получаемый от авторизовывающегося пользователя пароль прогоняем по этой функции и далее сравниваем получившийся результат с конечным значением данного пользователя из базы.