Как я указывал в комментарии к вашему вопросу, вектор атаки, который вы предполагаете (скомпрометированный сервер), подразумевает, что 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