Есть ли варианты асимметричного шифрования для JavaScript?

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

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

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


person Michael Stum    schedule 24.05.2011    source источник


Ответы (5)


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

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

person sstendal    schedule 25.05.2011
comment
Согласны, шифрование в JavaScript - плохая идея. Кроме того, на данный момент ни одна реализация JavaScript в браузере не поддерживает безопасную генерацию случайных чисел. Это означает, что любая криптография, реализованная в JavaScript, будет взломана независимо от других угроз. - person molf; 25.05.2011
comment
Спасибо. В этом есть смысл - я в основном думал об обнюхивании, а не о манипуляциях. Я подумаю об этом еще немного и посмотрю, можно ли как-нибудь использовать HTTPS. - person Michael Stum; 25.05.2011
comment
На самом деле, если не реализовано действительно осторожно, простое выполнение обычного асимметричного шифрования также не защищает от подслушивания. Обычно вы шифруете симметричный ключ с помощью ключа RSA, а затем выполняете шифрование с помощью симметричного сеансового ключа. Это шифрование обязательно будет использовать CBC с каким-то заполнением. Поскольку служба, обрабатывающая сообщение, находится в сети, вы создали схему, уязвимую для атак оракула с заполнением (разве криптография не забавна?). - person Maarten Bodewes; 26.05.2011
comment
@sstendal: Что делать, если соединение https. Могу ли я тогда использовать шифрование в javascript? Мне нужно сделать шифрование с открытым ключом. Поля формы пользователя подписываются его закрытым ключом на стороне клиента (клиент должен указать местоположение хранилища ключей, содержащего закрытый ключ). И отправляются на сервер. Там сервер проверяет, что правильный пользователь подписал, проверяя подпись с помощью соответствующего открытого ключа. Но я думаю, это невозможно. Потому что javascript изолирован. Полагаю, вы не можете получить доступ к файлам localhost. Пожалуйста, поправьте меня, ЕСЛИ я надет. Есть ли какой-нибудь способ найти это? - person Ashwin; 03.05.2012
comment
Теперь у нас есть целостность субресурсов developer.mozilla.org/en-US/docs / Интернет / Безопасность /. Это защитит javascript, обслуживаемый браузером. - person user2677034; 06.09.2019
comment
Хотя я согласен с общим советом, я категорически против утверждения, что шифрование в JavaScript в целом - плохая идея. В программном обеспечении не бывает стопроцентной безопасности. Поэтому полагаться на единый механизм, такой как https, для защиты всех ваших данных - плохой совет. Https не полностью защищает от атак типа «злоумышленник посередине» и перехвата. Использование шифрования в JavaScript - в качестве дополнительной меры противодействия - может значительно увеличить препятствия для преодоления схемы аутентификации. - person Andreas Vogl; 01.04.2021

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

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

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

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

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");

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

person Julien Kronegg    schedule 03.02.2014

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

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

См. Примеры: openpgp.js.

person user2677034    schedule 16.05.2014
comment
У вас есть источник, как это сделать с открытым ключом / закрытым ключом? - person nova; 20.04.2018

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

person dnolan    schedule 24.05.2011

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

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

person Baffe Boyois    schedule 24.05.2011
comment
В моем вопросе сказано, что это HTTP, а не HTTPS. Вот почему я смотрю на асимметричное шифрование, чтобы я мог хранить ключ дешифрования на стороне сервера. Именно это помогает решить асимметричное шифрование: человек посередине может получить зашифрованное сообщение, ключи, используемые для его шифрования, но без ключа для его расшифровки это не очень хорошо. - person Michael Stum; 25.05.2011
comment
Мужчина в средней атаке также может сменить лобковый ключ. Вам также нужна какая-то форма аутентификации, что довольно сложно сделать с точки зрения скрипта, запущенного в окне браузера. - person Maarten Bodewes; 25.05.2011
comment
@owl Какой ключ?!? В любом случае mitm может полностью отказаться от шифрования и просто отправлять конфиденциальные данные, собранные браузером, куда угодно. - person ErikE; 25.05.2011
comment
@Erik: Конечно, асимметричный открытый ключ. И вы правы, если злоумышленник может изменить открытый ключ, он также может изменить код на странице. Так что эта схема защищает только от подслушивания. Пока Майкл знает, что эта схема не защищает от MITM. - person Maarten Bodewes; 26.05.2011
comment
@owl смотри внимательно; ты сказал лобковый ключ. - person ErikE; 26.05.2011
comment
@Erik: Да, это то, что вы делаете с шифрованием: вы используете открытый ключ на странице и закрытый ключ на сервере. Открытый ключ может изменить кто угодно, если вы не аутентифицируетесь, так что это ключ, уязвимый для атак человека в середине. - person Maarten Bodewes; 26.05.2011
comment
@owl Я полностью понимаю криптографию с открытым и закрытым ключом. :) Щелкните эту ссылку и прочтите определение pubic. - person ErikE; 26.05.2011
comment
Чтобы предотвратить изменение javascript, рассмотрите возможность использования целостности субресурсов: developer.mozilla.org / en-US / docs / Web / Security / - person user2677034; 18.05.2019