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

Рубрики: Общее, на 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>

Я не спамер и не робот.
Я спамер и робот!

dimoning.ru
SEO и программирование.
  • Рубрики:



  • Рассылка:

  • Дополнительно:

  • По месяцам:

  • Счетчики:

    Яндекс цитирования
  • Спонсоры:


  • dimoning.ru © 2008-2011 г.
    Все материалы авторские, но их можно копировать с указанием прямой ссылки на источник.