Сила MD5: почему MD5 и как применять на практике » lamara-nsk.ru


lamara-nsk.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 и как применять на практике»


ae471697

    пишет:

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


    пишет:

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


    пишет:

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


    пишет:

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


    пишет:

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


    пишет:

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


    пишет:

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

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

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


    пишет:

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

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


    пишет:

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

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


    пишет:

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


    пишет:

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


    пишет:

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


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

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



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

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

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

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

-->








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