Javascript асимметричное шифрование и аутентификация - PullRequest
3 голосов
/ 15 сентября 2011

Некоторые из парней здесь разрабатывают приложение, которое включает в себя некоторые «безопасные области», доступные при входе в систему. В прошлом форма входа в систему и последующие «безопасные» страницы представляли собой простой текст, передаваемый через http, поскольку это приложение, которое выходит на использование на общих серверах, где мало шансов использовать SSL (например, WordPress и тому подобное). Большинство людей просто пожали плечами, потому что это все, чего они ожидали - это вряд ли национальный банк.

Сейчас мы думаем о написании следующей версии с использованием внешнего интерфейса JavaScript, с преимуществом загрузки всех изображений и CSS один раз, а затем записи HTML в DOM с помощью extJS (или, возможно, jQuery). Мы хотели бы зашифровать пользовательский ввод на клиенте перед отправкой на сервер, а затем расшифровать вывод на сервере в браузере, прежде чем отобразить его в HTML, чтобы обеспечить некоторую защиту пользователей. Есть также преимущества, которые можно получить, сократив время загрузки страницы, так как мы отправляем только сжатый JSON туда и обратно.

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

Для простоты ...:

  • Пользователь подключается к странице входа по стандартному http, где браузер загружает пакет JavaScript, содержащий алгоритмы хеширования и шифрования (например, SHA-256 и AES).
  • Пользователь вводит username, password и secret в форму входа.
  • Браузер JavaScript отправляет хеш username и password на сервер через AJAX. secret хранится только в JavaScript и никогда не отправляется через Интернет.
  • Сервер ищет хеш и извлекает username и secret из базы данных.
  • Сервер отправляет обратно в браузер хэш (тот же алгоритм, что и в браузере) username и secret.
  • Браузер JavaScript создает хэш username и secret и сравнивает его с хэшем, отправленным с сервера.
  • Если они совпадают, JavaScript браузера шифрует response с помощью secret и отправляет сообщение обратно на сервер.
  • Сервер расшифровывает сообщение с помощью secret, чтобы найти ожидаемое response, и начинает новый сеанс.
  • Последующие сообщения шифруются и дешифруются в обоих направлениях с помощью secret.

Похоже, у этого типа системы есть несколько преимуществ, но мы правы в том, что:

  • Пользователь знает, что он общается со своим сервером, если серверу удается создать хэш username и secret, доказывая, что сервер знает и понимает username и secret.
  • Сервер знает, что пользователь является подлинным, если ему удается зашифровать response с помощью secret, доказывая, что пользователь знает secret.
  • Никогда не передается secret в виде простого текста, или можно определить secret из хеша.
  • Анализатор только когда-либо узнает «безопасный» URL и обнаружит сжатые хэши и шифрование в строке запроса. Если они отправляют запрос на неправильный URL-адрес, ответ не дается. Если им каким-то образом удается угадать соответствующий запрос, они все равно должны иметь возможность расшифровать его.

Все это кажется достаточно быстрым, чтобы быть незаметным для пользователя. Может ли кто-нибудь увидеть это, поскольку мы все только что предположили, что мы не должны играть с шифрованием JavaScript!

Ответы [ 2 ]

8 голосов
/ 15 сентября 2011

Не делай этого. Пожалуйста, используйте SSL / TLS. См. Криптография Javascript Считается вредной

2 голосов
/ 29 ноября 2011

Если вы можете предоставить один сайт SSL для безопасной доставки вашего JavaScript (чтобы избежать атаки, упомянутой выше), то вы можете использовать библиотеку Forge с открытым исходным кодом для обеспечения междоменных соединений TLS с другими сайтами после создания самозаверяющих сертификатов. для них. Библиотека Forge также предоставляет другие базовые криптовалюты, если вы решите пойти в другом направлении. Forge имеет оболочку XMLHttpRequest, которая является почти всем JavaScript, с небольшим фрагментом, который использует API сокетов Flash для обеспечения междоменной связи.

http://digitalbazaar.com/2010/07/20/javascript-tls-1/

https://github.com/digitalbazaar/forge

...