Расшифровка OpenSSL в JavaScript в браузере - PullRequest
7 голосов
/ 23 июня 2011

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

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

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

Ответы [ 3 ]

3 голосов
/ 23 июня 2011

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

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

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

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

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

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

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

На платформе IE, CAPICOM должен был бы представлять интерес, но в настоящее время он кажется устаревшим .

1 голос
/ 23 июня 2011

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

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

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

  1. позволяет пользователюдля ввода некоторых данных на веб-странице
  2. позволяют пользователю ввести ключ шифрования
  3. шифровать данные с помощью ключа
  4. отправить зашифрованные данные обратно на сервер
  5. предоставляет страницу расшифровки, где пользователь может получить зашифрованный контент и ввести ключ
  6. расшифровать содержимое
0 голосов
/ 23 июня 2011

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

...