Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Безопасная авторизация с использованием ajax и md5 
:(
    Опции темы
_Dargin_
Дата 9.3.2008, 21:05 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 1.6.2007
Где: Барнаул

Репутация: нет
Всего: 1



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

Цель этой статейки объяснить, как можно очень просто создать быструю и защищенную авторизацию пользователя используя ajax и md5. Про то где держать данные пользователя говорилось очень много, кто не знает вкратце это либо кукисы с привязкой к IP и очень ограниченным временем, либо для параноиков в сессии smile.

Главная цель это защита от перехвата post запроса вирусами. Обычно у разработчика есть выбор: использовать стандартную авторизацию, которая стоит почти на всех CMS и ничем не защищена или защищенные протоколы.  Зачастую 2 либо не очень удобно ставить на «простенькие» сайты, либо просто лень smile.

Суть сей защиты очень проста, нужно хешировать передаваемый пароль на стороне клиента так, что бы его нельзя было переслать повторно (не важно откуда) и собрать такой же хеш можно было спокойно на сервере.

Есть довольно простое решение:
Сервер передаёт хеш IP и форму,  пользователь вводит пароль  и скрипт считает хеш(хеш IP + хеш(введеный пароль)) и передает вместе с логином на сервер. На сервере находится запись с таким логином и считается хеш аналогично как и на стороне клиента, если хеши совпадают, значит пароль верен (если сейчас кто-то вспомнил про хеш в мускуле, то мое мнение по этому поводу читайте в конце).
Таким образом, повторная отправка возможна только при аналогичном IP. Если ваш сайт простенький то такой защиты хватит за глаза.

НО, если вы разрабатываете деловой сайт, и защита играет не последнюю роль, то стоит призадуматься. Большинство офисов выходят в интернет через прокси, а следовательно у всего здания будет одинаковый IP.

Методов борьбы несколько, можно просто отправлять хеш IP с привязкой ко времени например: хеш(«гггг-мм-дд чч-мм + IP»), а на сервере просто перебрать такой же хешь с этой, предыдущей и предпредыдущей минутой. Таким образом, повторная отправка возможно тока в течение 2-3 минут. По сути это решает проблему, но этот метод мне не очень нравится. Я предпочетаю использовать авторизацию с картинкой.

Это тоже не сложно, есть обычная проверка цифрами на картинке - антибот, но свою функцию она как таковая не исполняет. Итак, сервер в сессию придумывает рандомом число и отправляет клиенту: 1 хеш IP, 2 хеш кода картинки (не обязательно). Пользователь вводит данные и сабмитит, скрипт сначала стандартно проверяет поля на заполненость, потом смотрит, равны ли хеш кода картинки хешу (введенный код пользователя), если нет, то предупреждает пользователя, это конечно не обязательно, но очень удобно. 
Данные в этом случае отправляются так 
хеш(хеш IP+введенные цифры с картинки(! не хеш естественно)+хеш(пароля))
сервер имеет все эти данные и без труда их сверяет.

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

А теперь представьте себе хакера, который ночью пробрался в офис жертвы, полностью ознакомлен с вашей системой защиты и пытается отправлять данные до тех пор пока не получит такой же код картинки smile но и тут мы можем банить, например при 50 запросах за 10 минут и эдак на сутки, не придупреждая smile но это на мой взгляд излишне и просто не гуманно smile

Рассуждение о данных на сервере.
Человек знакомый с этой проблемой сразу подметит, что если кто-то выкрадет хеш пароля с мускула, то после некоторых махинаций с скриптом заполучит себе доступ. Но логично ли это??? эту защиту обычно называют «защитой от своих», почему? а все просто. 
Если ваш сайт имеет хотя бы админку, то ему нужен полный доступ к мускулу (права на запись и чтение) и если хакер не дай бог smile получит возможность через дыры отправлять sql запросы или просто получит логин и пароль к мускулу, то он получит максимальный доступ и врятли станет переделывать скрипт, а просто создаст себе нового пользователя с правами админа или поменяет пароль у пользователя на время. Хотя бы потому что это быстрее smile и когда мне надо было зайти на сайт своего производства, где сменили пароли я сделал именно так, хоть у меня и были все исходники. Но все-таки хешировать пароли стоит, чтобы они не лежали открытым текстом и не были так соблазнительны smile

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

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

Присоединённый файл ( Кол-во скачиваний: 71 )
Присоединённый файл  md5.rar 1,48 Kb
PM MAIL ICQ Skype   Вверх
v2v
Дата 9.3.2008, 21:35 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



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


--------------------
PM   Вверх
Sardar
Дата 9.3.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Хеширование паролей - техника, используемая всеми не первый десяток лет... smile
И на этом форуме тоже. Кстати md5 коллизия подбирается за 8 часов по моему, лучше sha1 (который тоже по моему успешно атакован).

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

Заметим что при таком подходе весь код открыт, всё известно, кроме ключа - известного только пользователю. Владение ключём - признак принадлежности к профилю на сервере.

Ассиметрика тоже возможна, но это перебор smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
smartov
Дата 9.3.2008, 23:25 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 7
Всего: 259



_Dargin_
Цитата(_Dargin_ @  9.3.2008,  20:05 Найти цитируемый пост)
хеш(«гггг-мм-дд чч-мм + IP»)

Цитата(_Dargin_ @  9.3.2008,  20:05 Найти цитируемый пост)
возможно тока в течение 2-3 минут

Ярко  smile  Хеш, вычисляющийся с точностью до минут можно послать через 2 минуты?  smile

Добавлено через 13 секунд
А так статейка нормальная.
PM MAIL   Вверх
SelenIT
Дата 9.3.2008, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



smartov,
Цитата(_Dargin_ @  9.3.2008,  21:05 Найти цитируемый пост)
...а на сервере просто перебрать такой же хешь с этой, предыдущей и предпредыдущей минутой.



--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
v2v
Дата 10.3.2008, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



Цитата(Sardar @  9.3.2008,  22:20 Найти цитируемый пост)
Хеширование паролей - техника, используемая всеми не первый десяток лет... smile

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

по теме: 
керберос
протокол строгой аутентификации:
Цитата

Существует целое семейство протоколов, в которых аутентификационная информация пользователя совсем не передается по сети, а лишь участвует в вычислениях, как на клиентской, так и на серверной стороне. По такому принц Handshake Authentication Protocol – протокол аутентификации «запрос-ответ») и его версия от Microsoft – MS-CHAP. Протоколы «запрос – ответ» выполняются в несколько этапов.
Для шифрования случайного числа используется секретный ключ аутентифицируемого пользователя. Именно этот секретный ключ представляет собой аутентификационную информацию данного пользователя, его копия хранится на сервере в качестве эталона пользователя. Нетрудно заметить, что ни одна часть аутентификационной информации вообще не передается по сети, тем более в открытом виде. Аутентификация, в процессе которой используются криптографические методы, а аутентификационная информация не передается по сети, называется строгой.
В ряде случаев необходима взаимная аутентификация – взаимная проверка подлинности участников информационного обмена (когда не только сервер проверяет подлинность пользователя, но и наоборот). Протоколы «запрос – ответ» идеально подходят для взаимной аутентификации с некоторым дополнением (такой протокол часто называют «рукопожатием»).
Этап 1. Пользователь посылает серверу запрос на аутентификацию, содержащий его имя.
Этап 2. Сервер генерирует случайное число N1 и посылает его пользователю.
Этап 3. Пользователь зашифровывает случайное число N1: C1 = = E(N1), а также генерирует собственное случайное число N2. C1 и N2 пользователь посылает серверу.
Этап 4. Сервер расшифровывает C1 и сравнивает результат расшифрования с N1. Если числа равны, сервер считает пользователя подлинным. В этом случае сервер зашифровывает число N2: C2 = E(N2) и отправляет результат пользователю.
Этап 5. Пользователь расшифровывает C2 и сравнивает с N2. Если отправленное и полученное числа совпадают, то пользователь считает, что сервер успешно прошел проверку подлинности.
В подобных протоколах вместо симметричного шифрования может использоваться асимметричное шифрование или электронная цифровая подпись. В последнем случае в качестве эталонов пользователей на сервере хранятся их открытые ключи, которыми сервер проверяет не зашифрованное, а подписанное пользователем случайное число. Недостаток протоколов типа CHAP состоит в том, что, в отличие от PAP, на стороне пользователя необходимо наличие клиентского модуля, выполняющего предусмотренные протоколом действия.
Существуют и более «продвинутые» протоколы строгой аутентификации, например Kerberos. Это более сложный протокол, требующий наличия выделенных серверов, задача которых сводится лишь к управлению процессом аутентификации. При этом Kerberos не дает злоумышленнику практически никаких шансов вмешаться в процесс аутентификации. Кроме того, в процессе аутентификации создается ключ шифрования, который будет впоследствии использоваться для шифрования данных, передаваемых между пользователем и сервером. 




--------------------
PM   Вверх
Deepthroat
Дата 2.4.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 24.9.2007
Где: Outer Heaven

Репутация: 1
Всего: 2



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

Сейчас я, наконец нашел способ (спасибо автору):

- на сервере храним md5(pass)
- серверу передаем md5(R || md5(pass) || IP)

Время особо нет смысла передавать, так как само время сессии ограничено. А вот ограничение на количество попыток логина ввести стоит, чтобы исключить перебор.

Если хранить пароль на сервере можно, то передавать его лучше с использованием HMAC:

md5(pass XOR opad, md5(pass XOR ipad, R))

в Википедии все параметры описаны. Хотя, можно адаптировать и для моего случая, когда пароль не хранится. Делать, к примеру, не

pass XOR <value>, а md5(pass || <value>), тогда получим что-то вроде

md5(md5(pass, opad), md5(md5(pass, ipad), R))

но на сервере придется хранить уже два значения - P1 = md5(pass, opad) и P2 = md5(pass, ipad). А если и IP использовать, то получим:

md5(P1, md5(P2, R), IP).

Слишком много расчетов - это даже плюс, так как замедляет перебор, а пользователю один раз подождать не влом.


Итак, резюмруя.

1. На сервере храним login, P1 = md5(pass, opad), P2 = md5(pass, ipad), где opad и ipad - константы.
2. Пользователь хочет залогиниться. Он отправляет login.
3. Сервер формирует случайное число R и отправляет его клиенту вместе с его IP.
4. Клиент формирует значение md5(P1, md5(P2, R), IP) = md5(md5(pass, opad), md5(md5(pass, ipad), R), IP) и отправляет серверу.
5. Сервер тоже формирует значение md5(P1, md5(P2, R), IP) и сверяет его с полученным. При этом, R хранится в сессии, а IP вычисляется заново.
6. Даем пользователю попыток 5, затем баним на 1 минуту.

Преимущества:
(+) Пароли в открытом виде не хранятся и не передаются.

Недостатки:
(-) Возрастают накладные расходы на хранение и время вычисления, хотя наш своеобразный HMAC не намного сильнее простого md5(R, md5(pass), IP)
(-) Если хацкер украдет хеши с сервера, то он все равно сможет войти, хоть и никогда не узнает пароля.

С учетом второго недостатка спрашивается, а в чем же преимущество хранить хеши вместо паролей? Ведь кража и паролей, и хешей приведет к тому, что хацкер сможет залогиниться в системе! А преимущество в том, что многие пользователи используют один и тот же пароль с логином для всех своих учетных записей. Так что в нашем случае, взломав одну учетную запись, хацкер не получит доступ ко всему, что есть у пользователя.
PM MAIL WWW ICQ   Вверх
_Dargin_
Дата 3.4.2008, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 1.6.2007
Где: Барнаул

Репутация: нет
Всего: 1



Собственно описнаное выше это одно и тоже что вариант с картинкой, только вместо картинки используется цифра.
Вариант с картинкой удобнее тем что сама цифра не передается открытым способом и это также защищает от перебора.
Хотя картинка может быть и неудобна пользователю. А насчет скорости, так это работает намного быстрей обычной регистрации, в основном засчет ajaxа.
PM MAIL ICQ Skype   Вверх
Deepthroat
Дата 13.4.2008, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 24.9.2007
Где: Outer Heaven

Репутация: 1
Всего: 2



Основная проблема в том, что 100%-ной гарантии как не было, так и нет. Либо мы защищаемся от кражи данных с сервера, либо от перехвата трафика - одновременно защититься от всего не выйдет. А так, вообще, нормально. Хоть что-то.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1001 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.