Перейти к содержанию
Авторизация  
Saper

О том как передавать пароли

Рекомендуемые сообщения

Сегодня, дорогие мои программисты, я расскажу о том как правильно передавать пароли в сети.

 

В последнее время с ростом развития домашних сетей и интернета в целом, появляется всё больше сайтов и сервисов которыми пользуются юзеры. Доступ к ним как обычно осуществляется по логину и паролю. Любой сервис, будь то форум, электронные деньги, административный интерфейс сайта является объектом внимания злоумышленников, которые жаждут получить к нему доступ и извлечь из этого выгоду, моральную или материальную. В такой ситуации всё острее встаёт вопрос о безопасной аутентификации (проверки регистрационной информации) пользователей входящих на сайт, тем более что сайты становятся доступны локально в сети.

 

Запрашивая у пользователя логин и пароль нужно помнить о том, что каналы связи по которым к вам вернётся информация не являются безопасными. В интернете сетевые пакеты проходят несколько роутеров неизвестно чьих и под чьим контролем они находятся, где информация может быть перехвачена, даже без роутеров в обычной локалке на коммутаторах теоретически возможен перехват данных, о практической части того как это сделать я говорить не буду, чтобы не будоражить умы юных хакеров. Итак - в интернете и тем более в локалке верить нельзя никому и никогда !

Встаёт вопрос - как этого избежать ? Самый простой способ - включить SSL, это полное шифрование всех данных между клиентом и сервером, безупречный способ защитить данных. Но обычно он несколько тяжеловат - у пользователей выскакивает окно к информацией о сертификате, его нужно подтвердить, если на вашей странице есть части которые лежат не на вашем сервере, а на других и с них же подкачиваются, то будет выдаваться предупреждение о небезопасных элементах, что тоже напрягает.

Но есть другой способ ! Более простой, который поможет нам безопасно передать секретный пароль и обломать 99% хакеров.

 

Самый надёжный способ безопасно передать пароль - сам пароль не передавать.

 

Большинство сайтов используют один и тот же способ аутентификации юзеров - на странице есть два поля ввода, логина и пароля и кнопка "Войти", по нажатию на которую отправляется запрос на сервер, введённые данные передаются в открытом виде. Перехватчику достаточно увидеть в пакете эти два слова и считайте что ваши инфо-деньги/интернет уже у него в кармане.

 

 

Обычно такой код сайта выглядит примерно так

 

<form name="auth" method="post" action="http://www.mysite.ru/login.aspx">

<input name="login" id="l1" type="text"/>

<input name="pass" id="p1" type="password"/>

<input type="submit" value="Вход" />

</form>

 

 

Мы же, поступим хитрее - передадим вместо самого пароля его хэш. Хэш - это блок данных фиксированного размера, полученный в результате хэширования массива данных. Один и тот же массив данных (у нас это пароль) всегда даёт один и тот же хэш. Обратно из хэша пароль получить невозможно или очень трудно, главное чтобы пароль был подлиннее.

Таким образом, если мы на стороне клиента с помощью функции javascript сделаем из пароля хэш и передадим его, то мы сможем на стороне сервера проделать ту же операцию и сравнить хэши - если они совпали

то значит пароль был введён правильный. Наиболее популярная функция хэширования называется MD5 и её результат может выглядеть например так - 4570743eda53a1342c46aaefb58ab11f, такую билеберду вы обычно видите в адресной строке форума - это идентификатор сессии, но о ней позже.

 

 

Итак, берём и подключаем к нашей странице функцию которая умеет делать хэши. Взять её можно здесь - http://saper.ru/md5.txt

Положим её на сайт, например в виде файла md5.js и подключим на нашей странице ввода пароля строкой

<script language="JavaScript" src="md5.js" type="text/javascript"></script>

Функция которая нам нужна называется hex_md5, она принимает один параметр и возвращает хэш.

 

Что дальше ? Дальше мы сделаем так, чтобы при нажатии на кнопку пароль заменился на хэш.

Для этого мы изменим код кнопки на такой

<input type="submit" onclick="hashpass()" value="Вход" />

 

По клику мы вызываем функцию javascript hashpass(), добавим её в код нашей страницы

 

function hashpass()

{

var p = document.getElementById('p1').value;

p = hex_md5(p);

document.getElementById('p1').value = p;

}

 

Вы видите что значение поля пароля мы заменили на его хэш - именно он и уйдёт на сервер, в открытом виде пароль не передаётся.

 

Код который сделает то же самое на сервере я приводить не буду, мы все пишем на разных языках и он у каждого свой, нужно достать пароль пользователя по его логину (логин мы передаём в открытом виде, ничего секретного в нём нет) и сделать из него такой же хэш (в каждом языке есть хэш-функция md5). Потом сравнить то что пришло с тем что у вас получилось, если совпали - значит к вам пришёл на самом деле тот кого вы ждали, если нет, то сообщить что пароль неверный.

 

Казалось бы всё здорово, однако это не так. Всё выше написанное на самом деле никак не помогает от перехвата пароля. Разница лишь в том, что если до этого хакер перехватывал ваш пароль в открытом виде, то теперь он перехватывает хэш который всегда получается один и тот же из вашего пароля и, как и в случае с прямым паролем, если он пошлёт этот хэш на сервер, то сервер так же примет его и пустит под вашими правами т.к. хэши совпадут.

 

 

Что делать ? Ответ прост - сделаем так чтобы хэши каждый раз были разные. Поступим просто - на сервере, перед тем как сформировать страницу входа на сайт пользователю сгенерируем случайное число от 1 до 2 миллионов и отдадим его в странице в виде скрытого поля, выглядеть это будет в готовом виде примерно так <input type="hidden" name="salt" value="1456782"> Обязательно запомним это число в текущей сессии на сервере. Сессия - это данные о текущем состоянии сеанса с сервером каждого клиента. Она у каждого своя и какое-то время хранится на сервере. Сервер узнаёт каждого из нас индивидуально по тому самому идентификатору который вы часто видите в адресной строке (хотя это может быть и то же самое скрытое поле, или cookie, тогда вы этого не увидите).

 

В момент когда мы делаем хэш из нашего пароля прибавим к нему то самое случайное число и сделаем из полученной строки хэш который будем передавать.

 

function hashpass()

{

var p = document.getElementById('p1').value;

p=p+document.getElementById('salt').value;

p = hex_md5(p);

document.getElementById('p1').value = p;

}

 

Вуаля - к паролю всегда добавляется случайное число, пароль с этим прибавленным числом всегда разный, хэши из разных паролей тоже всегда разные при каждом входе на сайт. Теперь когда данные придут на сервер, он возьмёт из сессии запомненное число, которое отдавал этому пользователю, так же сложит его с паролем, сделает хэш и также сравнит как раньше - если совпали - то всё в порядке. Тут надо отметить что сервер именно обязан брать запомненное случайное число из своей памяти, а не принимать пришедшее на странице от пользователя. Как я уже говорил никому нельзя верить - хакер может перехватить наши данные один раз и попытаться их потом послать, если мы будем принимать на сервере пришедшее случайное число на веру и делать с ним действия, а не вспоминать именно то которое отдавали то хэши всегда будут совпадать, т.е. ситуация ничем не отличается если бы мы не передавали случайное число. Конечно пришедшее число и то которое в памяти сессии сервера должны совпадать, если нет, то вы можете смело вернуть страницу с содержанием - "Уважаемые хакеры - к вам уже выехали".

 

Таким образом, подмешивая случайную последовательность знаков к паролю и делая из полученного хэш мы добиваемся сразу многих целей.

1) Пароль не передаётся в открытом виде

2) Каждый раз при входе передаётся новый хэш, и сколько бы хакер их не перехватывал он не сможет войти, потому что они уже устарели.

3) Мы прибавляем к паролю 7 знаков, от этого он становится длиннее и даже последние программы нахождения коллизий в алгоритме md5 не смогут восстановить последовательность такой длины из хэша.

 

 

На этом пока всё.

 

Пожелания ? Просьбы ? Советы ?


Маша — это, конечно, Маша, но два раза — это два раза.

Поделиться сообщением


Ссылка на сообщение

слой защищенных розеток проще:angel:

Приведенный способ не спасает от перехвата содержимого страничек, а там информация может быть поконфидециальнее паролей.

Поделиться сообщением


Ссылка на сообщение
слой защищенных розеток проще:angel:

Приведенный способ не спасает от перехвата содержимого страничек, а там информация может быть поконфидециальнее паролей.

Ты эта ... тему то читай. Она звучит "о том как передавать ..." что ? :-)


Маша — это, конечно, Маша, но два раза — это два раза.

Поделиться сообщением


Ссылка на сообщение

а смысл? одним клиентом эту систему не реализуешь, а на серверах ее нужно внедрять долго и медленно.

 

2 Химик

Вот ты внедришь эту систему?

Поделиться сообщением


Ссылка на сообщение

а смысл? одним клиентом эту систему не реализуешь, а на серверах ее нужно внедрять долго и медленно.

 

Ничего не понял. Каким клиентом ? Всё делается на сервере за 15 минут.

 

2 Химик

Вот ты внедришь эту систему?

 

Ну, если он не хочет чтобы на рынке продавались диски с названием - "База данных логинов и паролей pushkino.org" ..... :-)


Маша — это, конечно, Маша, но два раза — это два раза.

Поделиться сообщением


Ссылка на сообщение

Это конечно все хорошо.

Но если все сделать именно так, то уязвимым местом остается автологин на сайт (по кукам), так как в куках запоминать salt бессмысленно, а проверить валидность юзера всетаки как-то надо.

 

p.s.

А вообще идея интересная, надо будет подумать как ее доработать.

Поделиться сообщением


Ссылка на сообщение
Это конечно все хорошо.

Но если все сделать именно так, то уязвимым местом остается автологин на сайт (по кукам), так как в куках запоминать salt бессмысленно, а проверить валидность юзера всетаки как-то надо.

 

Это точно. Спасения нет, нам всем конец. :-) С одной стороны если этого не сделать, то уязвимым местом остаётся вообще всё, с другой стороны если всё равно остаётся хоть одно уязвимое место, то зачем закрывать все остальные ? :-)

 

 

p.s.

А вообще идея интересная, надо будет подумать как ее доработать.

 

Сделать куки не перманентными ?


Маша — это, конечно, Маша, но два раза — это два раза.

Поделиться сообщением


Ссылка на сообщение

Есть такая фраза: "Лучшее враг хорошего", если все работает и всех все устраивает то лучше ничего не трогать.

Поделиться сообщением


Ссылка на сообщение

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×