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