Как защитить пароли юзеров на своем сайте с помощью соли? Для чего используется соль? Допустим вашу базу данных на сайте взломали, а там полностью открыты пароли. Никуда не годится, нужно шифровать что бы хакеру обидно стало. Ну что же, можно зашифровать в хэш md5, функцией md5() Например: PHP: <? $pass = md5("12345"); echo $pass; ?> Выведет результат: 827ccb0eea8a706c4c34a16891f84e7b Но не тут то было, хакер полезет в ближайший словарь, допустим http://crackfor.me/ И дешифрует хэш, такой способ шифровки надежен для автоматически сгенерированных паролей состоящих из 16 символов, ну ведь не все используют такие пароли, правильно? Придется усложнять задачу, «присыпим» соль. Соль – это автоматически генерируемая строка, которая «сыпится» на хэш md5. Создадим функцию для генерации соли: PHP: function gSalt() { $salt = ''; $length = rand(5,10); // длина соли (от 5 до 10 символов) for($i=0; $i<$length; $i++) { $salt .= chr(rand(33,126)); // выбираем символ из ASCII-table } return $salt; // выводим соль } Использовать можно как хотите, записываете в бд. например: PHP: $pass = md5('12345').gSalt(); mysql_query("INSERT INTO users (pass, salt) VALUES (".$pass.",".gSalt().")"); Теперь лучше усложнить задачу, два раза зашифруем пароль, сначала в md5, потом сам хэш md5 с солью опять в md5 PHP: $pass = md5(md5('12345').gSalt()); Можно приступить к проверке пароля на правильность. PHP: $md5 = '9e643770b1a1d3fdcafec1c3a1e02d27'; $salt = 'i[BxGS'; if (md5(md5('12345').$salt) == $md5) { echo 'Пароль правильный'; } ну $salt и $md5 выбираем из базы данных, пароль вставляем тот что записывали в бд с солью (в данном случае 12345) Если выводит «Пароль правильный» значит вы все верно сделали
За старания плюс и за разжевывания общих понятий. Но есть одно но: md5 уже не надежен. Даже с солью и двойным и тройным заворачиванием в md5. Многие перешли на SHA1, SHA256. С солью С данными хэшами можно с уверенностью сказать, что пару лет за них можно не беспокоится.
Да и sha уже на уровне того же md5 лет 5+ назад. В первую очередь это конечно минимальная энтропия.. 8 символов хоть и некого рода "стандрт", но всеже уже маловато... Хотя в случае с sha думаю будет достаточно на пол годика до плановой смены пассов А вообще лучше еще добавить всевозможные хитрости, типо strrev и тд, стойкости конечно не прибавит, но подумать заставит)
Написано легко и понятно, но для статьи этого маловато, не хватает разделов как "введение", "теория", "объяснение проблемы", "зачем это нужно ".и.т.д. У вас сразу идет кусок практики и так-же быстро заканчивается. p/s Если уж очень хочется безопасности то Двухфакторная авторизация в помощь, хотя и свои минусы у ней тоже есть, но они скорее в плане организации а не в плане безопасности.
К вопросу надежности MD5: нет, не надежен. Применительно к PHP, начиная с 5.5 версии доступно расширение Password Hashing, предоставляющее несколько могучих функций, например: password_hash, password_verify. Их и рекомендуется использовать в данный момент для создания механизма аутентификации пользователей. Более подробно - http://habrahabr.ru/post/194972/ . Если вкратце, то чем данные функции лучше md5\sha1? Настраиваемой стоимостью вычислений, что, скорее всего, превратит брут в непосильную задачу.