dimoning.ru
Это блог о сео, деньгах, заработке в сети, разработке своих проектов, программировании
и "жизни программиста", бизнесе, блогосфере, фрилансе и многом другом.


Контакты, Реклама в блоге




Сила MD5: почему MD5 и как применять на практике

Автор DimoninG, написано 26.04.2009
Рубрика Общее, на PHP  

Меня иногда спрашиваю, а в чем крутость 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’);»));



Отзывов (12) на «Сила MD5: почему MD5 и как применять на практике»

    librarian пишет:

    И не забудьте про соль, а то Rainbow таблицы сейчас только ленивый не использует


    Smarty пишет:

    Лучше шифровать таким способом: md5(md5($pass).$some_word)


    Щдуп пишет:

    Как бороться с подбором хэшей к паролям


    Андрей пишет:

    2 Щдуп: на сколько ваши данные важны, чтобы тратить кучу ресурсов на подбор md5? Если сильно важны и вы за них боитесь, попробуйте SHA, он, вроде, надёжнее md5… Если этого мало, поищите другие алгоритмы, с длинной ключа 512, 1024, 2048 бит…


    AngelOfFate пишет:

    о спасибо за пример, я как раз искал нечто подобное для авторизации…


    lispad пишет:

    Щдуп, Андрей, imho как вариант можно добавлять к паролю в начало и в конец мусор потипу «D1Moning12%$^52″.
    На сколько мне известно существующие таблицы не покрывают весь диапазон хешей… А только буквенные/буквенноцифровые,до 8ми или … в зависимости от крутости сервиса.


    Андрей пишет:

    lispad, такой вариант прокатит только в том случае, если пользователь получил доступ к базе, но не получил доступ к исходникам.

    Если к исходникам доступа нет, то такая штука усложнит перебор md5, а если есть, то ни чем не поможет. Я закладыаюсь на то, что есть доступ как к базе, так и к исходникам.

    ИМХО лучший вариант — это большой хеш, который перебрать невозможно в принципе…


    voff пишет:

    Андрей, если есть доступ и к исходникам и к базе, то зачем еще что то ломать? Чаще всего в следствии sql инъекции хакер просто может выводить значение полей, например логин и пасс админа, и тут соль очень даже кстати.

    «а расшифровать его обратно нельзя – слишком моного возможных комбинаций»– эх… как было бы здорово… ибо «нужно проверять хеш из базы с хешем введенного пароля, который мы создаем “на лету”»


    Андрей пишет:

    voff, цель хеширования — не дать узнать пароль. Если есть доступ на выполнение SQL, то можно сделать update users set password=md5(‘12345′).

    Решение зависит от задачи, если задача скрыть пароль, то хеш помогает, если другая, то надо думать :)


    voff пишет:

    Андрей, согласен с тобой, но sql инъекции довольно редко позволяют выполнять update, чаще всего только insert.


    Андрей пишет:

    voff, я в инекциях не силён, в чём принципиальная разница между insert и update? Если можно сделать insert, то можно и replace сделать, если это mysql…


    voff пишет:

    Не совсем, самая частый тип инъекций – это когда к select запросу можно добавить union и вывести значения из другой таблицы, вместо тех, которые должны выводиться по замыслу програмера. При этом не update не insert ввполнить не получится.


Оставьте свой комментарий

Теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Что здесь почитать?



1.   Разработки.
1.1 Плагин "Я не робот"
1.2 Плагин "Код Adsense прямо в пост"

2.   Заработай.
2.1 Блогун: 20$ в день
2.2 Уходим от налогов в Sape
2.3 Хватит думать, пора зарабатывать

3.   Акции и конкурсы.
3.1 Ссылка за "Рабочий стол"

Показать весь список.

-->








Блог на движке WordPress и тема для него создана DimoninG'ом в 2007 году.
Все материалы авторские, их копирование запрещено законом об авторском праве.