расшифровка openssl в javascript в браузере

Я ищу способ декодирования сообщений RSA на стороне клиента, соответственно закодированных сообщений openssl.

Идея:
Специальные данные хранятся на сервере только в зашифрованном виде с помощью открытого ключа, чтобы никто не мог увидеть настоящие данные — даже в случае взлома сервера.
Администратор в Затем adminforce может «открыть» эти файлы, передав их в браузер, и некоторый код javascript расшифрует данные, чтобы они никогда не расшифровывались на сервере, а только на защищенной стороне клиента.
Мне действительно нужно, чтобы они были расшифрованы напрямую. в браузере с пользовательским javascript, потому что эти данные затем должны использоваться некоторыми клиентскими алгоритмами в js.

Проблема:
Кажется, в javascript нет библиотеки openssl, или я еще не нашел ее. Хотя существует несколько реализаций RSA на чистом js, они реализуют только простой алгоритм RSA, но простой RSA небезопасен для использования в качестве блочного шифра и имеет некоторые атаки, такие как "атаки с выбранным открытым текстом".
Кто-нибудь знает о реализации декодирования openssl в javascript или о плагине для firefox/chrome, который добавляет эти функции в документ? Или любое другое безопасное асимметричное шифрование, встроенное в javascript?


person Tobias P.    schedule 23.06.2011    source источник
comment
В этом подходе есть небольшой недостаток: если ваш сервер взломан, вполне вероятно, что злоумышленник также сможет изменить обслуживаемый им JavaScript, что может прозрачно отправить расшифрованный контент обратно на сервер (и, следовательно, злоумышленнику). Использование JS подразумевает, что клиентская сторона больше не защищена, когда происходит такая атака. Для этого лучше разработать отдельное приложение, возможно, подписанный Java WebStart (или апплет), если он не подписан закрытым ключом, хранящимся на сервере.   -  person Bruno    schedule 23.06.2011
comment
Бруно, ты совершенно прав, но мне не нужна js-реализация openssl, работающая на веб-странице, которая может быть скомпрометирована сервером. Я хочу написать расширение для браузера, которое не может быть скомпрометировано вредоносным js-кодом на веб-странице.   -  person Tobias P.    schedule 23.06.2011


Ответы (4)


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

Я бы предложил пойти по пути автономного приложения (например, Java WebStart), возможно, подписанного (с закрытым ключом, который не хранится на сервере).

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

Когда вы используете закрытый ключ в своем браузере для аутентификации сертификата клиента SSL/TLS, закрытый ключ не подвергается воздействию кода, используемого сервером. Он используется браузером для рукопожатия, и сервер получает сертификат (который является общедоступным), но закрытый ключ не идет ни в какое сравнение с тем, что может видеть код HTML + JS. (На самом деле, в OSX с Safari закрытый ключ используется базовой библиотекой SSL/TLS и даже не подвергается воздействию пользовательского процесса.)

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

Возможность использовать закрытый ключ в браузере для операций RSA, не позволяя сценарию получить доступ к самому закрытому материалу, потребует более тесной интеграции с браузером, в частности, некоторого API для подписи и расшифровки, который будет использовать эти функции непосредственно в механизм безопасности браузера, не раскрывая материал закрытого ключа (в целом подход, аналогичный тому, что PKCS#11 предлагает приложениям, использующим его).

Насколько мне известно, текущий Mozilla crypto JavaScript API не предоставляет функций для расшифровки /sign с помощью браузеров (это только для запроса сертификата и генерации ключа). Хотя, кажется, есть планы сделать это:

На платформе IE CAPICOM должен представляли интерес, но похоже, -the-browser" rel="nofollow">устарел в настоящее время.

person Bruno    schedule 23.06.2011
comment
Firefox может безопасно хранить закрытый ключ, даже если веб-страница будет удалена злоумышленником. Я уже наткнулся на Mozilla Crypto API, и, к сожалению, он еще не поддерживает это, мне не нужно было спрашивать, будет ли он поддерживаться :-( - person Tobias P.; 23.06.2011
comment
Конечно. Честно говоря, я не пробовал DOMCrypt (как упоминалось здесь), но он также с открытым исходным кодом, поэтому, вероятно, стоит изучить: github.com/daviddahl/domcrypt. Вам, безусловно, потребуется установить плагин, но он не кажется плохим решением для того, что вы ищете. - person Bruno; 23.06.2011
comment
не тот ответ, который я надеялся получить, но я не буду использовать свой план резервного копирования для создания независимого установленного инструмента, хотя, похоже, в javascript нет хорошего функционального решения для пользовательского плагина Firefox. - person Tobias P.; 27.06.2011

Шифрование сложное и дорогое, особенно асимметричное шифрование (в большинстве случаев асимметричное шифрование используется только для шифрования случайно сгенерированного ключа симметричного алгоритма).

Существуют реализации RSA (и, возможно, других асимметричных алгоритмов в javascript), а в некоторых случаях совместимые реализации на других языках (обычно C) — попробуйте Google для уточнения — но я не знаю ни одной, которая обрабатывает шифрование x509. OTOH, написание Java-апплета для этого было бы тривиально.

Но зачем беспокоиться? Насколько я понимаю то, что вы написали, вы получите столько же функциональности за гораздо меньшие усилия, используя симметричный алгоритм и никогда не отправляя ключ обратно на сервер:

  1. разрешить пользователю вводить некоторые данные на веб-странице
  2. разрешить пользователю вводить ключ шифрования
  3. зашифровать данные с помощью ключа
  4. отправить зашифрованные данные обратно на сервер
  5. предоставить страницу расшифровки, где пользователь может получить зашифрованный контент и ввести ключ
  6. расшифровать содержимое
person symcbean    schedule 23.06.2011
comment
... но я не знаю ни одного, который обрабатывает шифрование x509: в шифровании X.509 нет ничего конкретного. Если это сертификат X.509 с ключом RSA, важен алгоритм RSA, а не столько оболочка X.509 (тем более, что для расшифровки требуется только закрытый ключ, который не зависит от способа использования открытого ключа). упаковано: в сертификате X.509, сертификате PGP или открытом ключе). (То же самое относится к использованию ключа DSA в сертификате X.509 с DSA.) - person Bruno; 23.06.2011
comment
Я знаю, что асимметричное шифрование стоит дорого, но мне нужно будет закодировать всего несколько байтов. Симметричное шифрование не является решением, поскольку сервер должен (временно) знать ключи, это не подходит для этой цели. Хотя пользователь не знает о шифровании, он отправляет данные на сервер, не зная о шифровании, и они хранятся там в зашифрованном виде, чтобы администратор мог просмотреть данные. - person Tobias P.; 23.06.2011
comment
@ Тобиас П.: сервер должен (временно) знать ключи - вы думаете, что, используя множество сложных алгоритмов, вы делаете систему безопасной. Единственная причина, по которой серверу необходимо временно знать ключи, — это временный доступ к зашифрованному содержимому — и вы можете сделать это, отправив обратно незашифрованную копию вместе с зашифрованной. - person symcbean; 24.06.2011

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

person TheBrain    schedule 23.06.2011
comment
Однако он не получит закрытый ключ конечного пользователя. Это по-прежнему требует действий от законного пользователя. - person Bruno; 23.06.2011
comment
@TheBrain: Что ты имеешь в виду? Конечно, вы можете реализовать алгоритмы RSA в JavaScript, но как это поможет злоумышленнику получить доступ к закрытому ключу? Для безопасной системы браузер в любом случае никогда не должен передавать закрытый ключ JS. - person Bruno; 23.06.2011
comment
@Bruno: да, вы поняли проблему, но плагин Firefox, закодированный на js, недоступен для атакуемой веб-страницы, поэтому ключ может храниться там безопасным образом, но даже позволяет взаимодействовать с зашифрованными данными. - person Tobias P.; 23.06.2011
comment
@TheBrain: я уже наткнулся на стэнфордскую библиотеку, но они реализуют только простой RSA, у которого есть некоторые недостатки. - person Tobias P.; 23.06.2011
comment
@ Тобиас Тобиас, действительно, если это плагин, он другой, он больше похож на отдельное приложение (API DOMCrypt, указанный в моем ответе, идет по этому пути). - person Bruno; 23.06.2011

Вместо того, чтобы полагаться на веб-сервер для отправки вам как зашифрованных данных, так и связанного кода JavaScript для расшифровки данных (которые могут быть повреждены в случае взлома сервера), вы можете только загрузить данные с веб-сервера и расшифровать их с помощью отдельное приложение или веб-страница с JavaScript, которая НЕ поступает с того же веб-сервера (может быть с другого сервера или из локального файла). Таким образом, исходному серверу или злоумышленнику не будет возвращено никаких ответов.

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

Ознакомьтесь с этой нативной реализацией TLS в JavaScript.
Вот руководство по включите подсистему Windows для Linux в Win 10для установки Bash, который поставляется с SSL. Проверьте свою версию и получите последнюю версию.

person Zimba    schedule 27.08.2020