Существуют ли какие-либо асимметричные варианты шифрования для JavaScript? - PullRequest
22 голосов
/ 25 мая 2011

Мне нужно передать некоторую конфиденциальную информацию через JavaScript AJAX Call, по незашифрованному каналу (HTTP, а не HTTPS).

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

Существует ли какое-либо асимметричное шифрование для JavaScript?Таким образом, я могу хранить секретный ключ расшифровки сервера.(Я не беспокоюсь о безопасности сообщений Server> JavaScript, только о безопасности определенного сообщения JavaScript> Server) *

Ответы [ 5 ]

13 голосов
/ 25 мая 2011

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

Если злоумышленник сможет изменить трафик, то он также сможет изменить скрипт, который выполняет шифрование. Самая простая атака - полностью удалить шифрование из сценария. Если у вас нет https, и возможен человек посередине (что имеет место почти в каждом сценарии), то у вас нет никакого контроля над HTML или JavaScript, который представлен до конца пользователь. Злоумышленник может полностью переписать ваш html-код и javascript, отключить шифрование, создать новые поля формы в вашей форме и т. Д. Https является необходимым условием для безопасного общения на веб-канале.

8 голосов
/ 03 февраля 2014

Я сделал это. Я использую это асимметричное шифрование RSA на стороне клиента JavaScript, чтобы предотвратить отправку учетных данных для входа в виде простого текста по HTTP.

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

Клиентское шифрование использует превосходную работу Трэвиса Тридвелла , основанную на JSBN . Веб-страница Travis также может генерировать закрытые и открытые ключи RSA (если вам лень использовать openssl). Ключи генерируются в формате PCS PKCS # 1. Я шифрую username+password+timeInMs+timezone, чтобы зашифрованный контент изменялся при каждом входе в систему.

На стороне сервера мой код Java прочитал чтение PEM-файла PKCS # 1, используя Apache JMeter's org.apache.jmeter.protocol.oauth.sampler.PrivateKeyReader:

PrivateKey pk = (new PrivateKeyReader("myPrivateKeyFile.pem")).getPrivateKey();

Затем я расшифровываю зашифрованный контент, используя

byte[] enc = DatatypeConverter.parseBase64Binary(clientData);
Cipher rsa = Cipher.getInstance("RSA");
rsa.init(Cipher.DECRYPT_MODE, pk);
byte[] dec = rsa.doFinal(enc);
String out = new String(dec, "UTF8");

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

3 голосов
/ 16 мая 2014

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

PS Я хотел написать это как комментарий, так как это было бы более уместно, чем ответ, но у меня не хватает очков:)

3 голосов
/ 25 мая 2011

Сервер> Сообщения JavaScript отправляются по HTTPS?

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

3 голосов
/ 25 мая 2011

Этот вопрос, кажется, имеет то, что вы ищете, Библиотека криптографии Javascript для подписи данных формы в браузере Ссылка PGP: http://www.hanewin.net/encrypt/ имеет RSA

...