Использовать модуль шифрования JavaScript вместо SSL / HTTPS - PullRequest
3 голосов
/ 28 февраля 2011

Стоит ли использовать некоторую библиотеку шифрования JS для безопасной связи вместо SSL?Я спрашиваю об этом, потому что хочу защитить свое приложение, построенное на Google App Engine, и оно не позволяет вам использовать собственный домен для запросов SSL.Каковы хорошие способы безопасного общения с GAE?Спасибо.

Ответы [ 4 ]

4 голосов
/ 29 марта 2012

[см. Исправление ниже]

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

Вот основные инструкции для Python, но вы можете изменить для Java. Будьте готовы потратить, по крайней мере, день или два на то, чтобы все заработало.

Требования:

  • Библиотека Python RSA и AES для сервера. pyCrypto хорошо работает на GAE.
  • Javascript RSA и AES библиотека для запуска на клиенте. Я использовал Стэнфордскую библиотеку RSA и crypto-js для AES. Я не могу вспомнить, почему я не использовал только одну библиотеку.

Инструкция:

  • Шаг 1: В автономном режиме создайте пару открытых и закрытых ключей RSA. Вот pyCrypto инструкции.

  • Шаг 2. Сохраните сгенерированные открытые и закрытые ключи RSA в файле python, убедитесь, что закрытый ключ недоступен для общего доступа.

  • Шаг 3: На сервере создайте запрос, который генерирует файл javascript. Файл javascript должен только передавать открытый ключ клиенту. Например, он будет возвращать только файл с таким:

    var public_key="[your public rsa key here]"

  • Шаг 4. В файле app.yaml убедитесь, что созданный файл javascript обслуживается только по SSL (т. Е. Установлен secure: always). См. инструкции здесь .

  • Шаг 5: На клиенте загрузите файл javascript, используя ssl. Однако вместо использования своего пользовательского домена используйте домен appspot. Например, добавьте это в ваш HTML-файл:

    <script src="https://example.appspot.com/publicKey.js"></script>

    Теперь у клиента будет аутентифицированный открытый ключ RSA, предотвращающий атаки «человек посередине». Примечание: доступ к другим доменам обычно запрещается браузерами для предотвращения XSS , но есть лазейка, позволяющая загружать файлы JavaScript.

  • Шаг 6. На клиенте сгенерируйте случайный закрытый ключ. Используйте библиотеку javascript RSA и открытый ключ, который мы получили на шаге 4, для шифрования случайного закрытого ключа. Отправьте зашифрованный закрытый ключ на сервер.

  • Шаг 7. На сервере расшифруйте случайный ключ, сгенерированный на клиенте, с помощью закрытого ключа RSA.

    На этом этапе и сервер, и клиент имеют один и тот же закрытый ключ. Более того, поскольку исходный открытый ключ был передан по протоколу SSL, мы можем подтвердить подлинность того, что сервер действительно является тем, кем, по нашему мнению, он является (т. Е. Нет посредника).

  • Шаг 8. Теперь сервер и клиент могут шифровать и дешифровать любые данные, которые они хотят, используя случайно сгенерированный закрытый ключ и соответствующие им библиотеки AES.

- РЕДАКТИРОВАТЬ: ИСПРАВЛЕНИЕ -

Комментарий Бруно ниже на 100% правильный, вышеописанные шаги небезопасны. Несмотря на то, что описанные выше шаги действительно работают для настройки аутентифицированного сеанса между клиентом и сервером, единственный способ, которым пользователи действительно узнают, что он был аутентифицирован, - это если они проверили код, чтобы убедиться, что открытый ключ загружался с использованием https. Человек посередине может обслуживать начальную HTML-страницу, изменяя код <script src="https://..., чтобы указывать на что-то другое.

Вместо этого взгляните на wwwizer.com .

3 голосов
/ 28 февраля 2011

Javascript - это язык на стороне клиента, то есть он работает в браузере пользователя, поэтому любой пользователь может изменять, манипулировать и отключать его по своему усмотрению; делая ваше шифрование бесполезным.

РЕДАКТИРОВАТЬ: Разве вы не имеете в виду Java?

2 голосов
/ 01 марта 2011

Нет, это того не стоит, потому что вы должны каким-то образом отправлять код Javascript клиенту. Злоумышленник может просто изменить Javascript, чтобы он мог прочитать (или изменить) все сообщения, делая все ваши средства защиты бесполезными. SSL действительно единственный вариант.

0 голосов
/ 28 февраля 2011

Вы должны использовать https, но вы не можете использовать его на своем домене с appengine.Они говорят, что скоро добавят эту способность.Мы использовали раздражающий домен appspot https, предполагая, что они действительно добавят поддержку пользовательских доменов https, но в то же время ни один из наших (~ 75) клиентов не пожаловался на вещь appspot.на самом деле вопрос в том, сколько людей НЕ ПОЛУЧАЕТ клиентов из-за приложения appspot ... но я подозреваю, что это небольшое число.

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