вторник, 24 июля 2012 г.

Об использовании секретных ответов на вопрос


Как известно, раньше никто особо не думал о безопасности паролей в базе данных. Сейчас же тенденция изменилась в лучшую сторону — многие программисты стали использовать хеширование (хотя бы просто md5, со времени написания старой версии статьи тенденция еще улучшилась — стали использовать даже хеши с использованием "соли" и прочие технологии).
В то же время на многих сайтах есть функция хранения секретных слов. И как раз тут все намного интереснее...

А суть в том, что на многих сайтах ответ на секретный вопрос вообще никак не кодируется, то есть, злоумышленник, получив базу данных, может запросто её использовать! Пароли подобрать очень сложно, особенно если используется "соление хеша" (хотя обычно пароли типа «1111» или используя словарь взламываются обычным гуглением этого хеша). И вдруг... Он видит, что в базе находится ответ на секретный вопрос для восстановления пароля без любой защиты! Всё, фактически теперь он может взломать любого пользователя. Обычному пользователю изменить это слово чаще всего невозможно, в результате чего мы получаем плачевные последствия — массовый взлом учеток на сайте. Когда кодер поймёт, что взлом был произведен через секретные слова, может пройти немало времени. На практике администратор будет думать о возможности взлома через эту функцию в последнюю очередь. А хватит только секретное слово одного модератора, чтобы удалить подчистую весь форум или довольно большой портал! С учетом того, что обычно бекапы на многих сайтах в лучшем случае делаются раз в месяц, могут получится большие убытки.
Вывод №1: хешировать надо не только пароль, но и секретное слово. Неплохой идеей также будет перевод этого слова в нижний регистр (это не повредит, мало кто помнит, писал ли первое слово ответа с большой или нет?).
Вопрос, который при этом возникает: хорошо ли ставить везде одинаковый ответ на секретное слово? Конечно же плохо. Например, вы зарегистрируетесь на каком-то сайте "wap-site.ru", по-глупости укажете секретное слово, которое используете в... icq, e-mail, доступу к биллинг-панели вашего сайта... Недобросовестный администратор получит эти данные, просто открыв базу данных, и это может иметь плачевные последствия. Вы не можете быть уверенными в том, что ответ на это слово хранится в зашифрованном виде.
Вывод №2: не указывайте на двух разных сайтах одинаковые ответы, особенно, если вы не уверены в честности администратора сайта!
Еще несколько выводов:
1) Никогда не указывайте очевидные ответы на вопрос. У многих людей в ответе на вопрос "Какой у вас любимое блюдо?" стоит "пельмени", "шашлыки", "борщ", "суши". Кроме того, для многих не секрет узнать девичью фамилию вашей матери, особенно если они знакомы с вами лично (и с вашей матерью). То же самое касается имени вашего домашнего питомца. Никогда не стоит указывать информацию, которую можно запросто подобрать или угадать! Лучшим ответом на вопрос "Ваше любимое блюдо?" будет что-то типа "PyschPyschOlolo!!%^&1";)
2) Программисту, посоветовавшись с заказчиком, стоит отказываться от этого неэффективного метода, и переходить, к примеру, на использование подтверждения на номер телефона. Хотя, должен сказать, это недешёвое удовольствие, но можно сделать по принципу:
"Вы должны отправить сообщение «11 Retrieve» на номер 2323, чтобы разблокировать ваш аккаунт и получить новый пароль! Стоимость смс - стандартная" (и сделать так действительно!). Потом проверяем - этот ли номер, с которого отправлено сообщение, был указан при регистрации, и уже в качестве ответа присылаем новый пароль.
Да, этот метод имеет свои недостатки (подключать смс-обработчик, да и не каждый пользователь на это согласится, да и не всегда это оправдано), но это лучше любых секретных слов.
Удачи!

Комментариев нет:

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