|
Меня иногда спрашиваю, а в чем крутость MD5? На кой черт нужно шифровать пароли этим хешем?
Отвечаю. Предположим, что злоумышленник нашел дырку в нашем сайте. Чтобы было серьезнее, предположим, что он нашел доступ к базе данных и может прочитать пароли всех пользователей (но перезаписывать базу данных он не может; так часто бывает).
Что происходит, если пароли лежат в открытом виде? Понятно: он берет любой логин и пароль и заходит под ними, делает гадости. Что происходит, если пароли зашифрованы двунаправленным шифрованием (это когда можно зашифровать и другим скриптом расшифровать)? Так как обычно тоже применяются стандартные алгоритмы, взломщик помучается, но расшифрует пароль. Что происходит, если пароль зашифрован с помощью md5? Взломщик видит хэш, но ничего сделать не может. Это однонаправленный метод шифрования.
Небольшая справка. Что такое однонаправленное шифрование? Это когда слово шифруется по какому-то алгоритму, а расшифровать его обратно нельзя – слишком моного возможных комбинаций или другая причина.
Как применять md5 на практике? Когда пользователь регистрируется и первый раз вводи пароль, в базу мы записываем его MD5-хеш. Ну скажем так:
$login = $_POST['login'];
$hash = md5($_POST['password']);
mysql_query («INSERT INTO table VALUES (0, ‘$login’, ‘$hash’);»)
Теперь, когда пользователь заходит в свой аккаунт, нужно проверять хеш из базы с хешем введенного пароля, который мы создаем «на лету». Например так:
$login = $_POST['login'];
$pass = $_POST['password'];
$user = mysql_fetch_array (mysql_query («SELET * FROM table WHERE login=’$login’;»));
if ($user['hash'] == md5($pass)){ /* вошли успешно */}
Конечно, я тут не проверял входящие данные и не проверял ошибки. Кстати, MySQL тоже понимает MD5, поэтому код выше можно переписать так, оставив только запрос:
$login = $_POST['login'];
$pass = $_POST['password'];
$user = mysql_fetch_array (mysql_query («SELET * FROM table WHERE login=’$login’ AND hash=MD5(‘$pass’);»));
Оставьте свой комментарий
|
26.04.2009 в 7:40 пп
И не забудьте про соль, а то Rainbow таблицы сейчас только ленивый не использует
26.04.2009 в 7:48 пп
Лучше шифровать таким способом: md5(md5($pass).$some_word)
26.04.2009 в 8:04 пп
Как бороться с подбором хэшей к паролям
27.04.2009 в 8:27 дп
2 Щдуп: на сколько ваши данные важны, чтобы тратить кучу ресурсов на подбор md5? Если сильно важны и вы за них боитесь, попробуйте SHA, он, вроде, надёжнее md5… Если этого мало, поищите другие алгоритмы, с длинной ключа 512, 1024, 2048 бит…
27.04.2009 в 3:50 пп
о спасибо за пример, я как раз искал нечто подобное для авторизации…
27.04.2009 в 8:42 пп
Щдуп, Андрей, imho как вариант можно добавлять к паролю в начало и в конец мусор потипу «D1Moning12%$^52″.
На сколько мне известно существующие таблицы не покрывают весь диапазон хешей… А только буквенные/буквенноцифровые,до 8ми или … в зависимости от крутости сервиса.
28.04.2009 в 5:16 пп
lispad, такой вариант прокатит только в том случае, если пользователь получил доступ к базе, но не получил доступ к исходникам.
Если к исходникам доступа нет, то такая штука усложнит перебор md5, а если есть, то ни чем не поможет. Я закладыаюсь на то, что есть доступ как к базе, так и к исходникам.
ИМХО лучший вариант — это большой хеш, который перебрать невозможно в принципе…
30.04.2009 в 10:05 дп
Андрей, если есть доступ и к исходникам и к базе, то зачем еще что то ломать? Чаще всего в следствии sql инъекции хакер просто может выводить значение полей, например логин и пасс админа, и тут соль очень даже кстати.
«а расшифровать его обратно нельзя – слишком моного возможных комбинаций»– эх… как было бы здорово… ибо «нужно проверять хеш из базы с хешем введенного пароля, который мы создаем “на лету”»
30.04.2009 в 1:17 пп
voff, цель хеширования — не дать узнать пароль. Если есть доступ на выполнение SQL, то можно сделать update users set password=md5(‘12345′).
Решение зависит от задачи, если задача скрыть пароль, то хеш помогает, если другая, то надо думать
30.04.2009 в 1:33 пп
Андрей, согласен с тобой, но sql инъекции довольно редко позволяют выполнять update, чаще всего только insert.
30.04.2009 в 10:38 пп
voff, я в инекциях не силён, в чём принципиальная разница между insert и update? Если можно сделать insert, то можно и replace сделать, если это mysql…
01.05.2009 в 12:28 пп
Не совсем, самая частый тип инъекций – это когда к select запросу можно добавить union и вывести значения из другой таблицы, вместо тех, которые должны выводиться по замыслу програмера. При этом не update не insert ввполнить не получится.