WebCrypto: безопасное преобразование из RSA-OAEP в RSA-PSS

WebCrypto поддерживает RSA, но заставляет вас выбирать схему заполнения для различных операций, которые вы можете выполнять. RSA может выполнять как подписание / проверку, так и шифрование / дешифрование (+ перенос ключей), но это не очень возможно с API webcrypto.

Когда я генерирую ключ RSA с помощью RSA-OAEP, тот же ключ можно было бы использовать для RSA-PSS, однако нет четкого способа обойти тех, кто использует API webcrypto.

Моя первоначальная мысль заключалась в том, чтобы предпринять следующие шаги для преобразования ключей:

  1. экспортировать ключ, используя exportKey с jwk
  2. "исправить" alg с (например) RSA-OAEP-512 на PS512
  3. "исправить" key_ops

    a. encrypt-> verify

    b. decrypt -> sign

  4. Импортируйте «фиксированный» ключ с правильным алгоритмом.

Эта система выходит из строя, когда ключ не экспортируется, что я хочу сделать для дополнительной безопасности закрытых ключей (вредоносные скрипты, self-xss и т. Д.).

Что было бы хорошим способом «конвертировать» между типами алгоритмов, кроме сохранения ключа без возможности экспорта?


person LiraNuna    schedule 11.12.2017    source источник
comment
Экспорт privateKey как pkcs8 с последующим его импортом через RSA-PSS также работает и не требует шагов 2-3! То же самое и с открытым ключом, если вы используете spki. Однако проблема все еще существует, требуется, чтобы ключ можно было извлечь ...   -  person LiraNuna    schedule 11.12.2017


Ответы (1)


API webcrypto не позволяет использовать ключ для подписи и шифрования. Наверное, потому, что такая практика не рекомендуется. См. Этот ответ https://crypto.stackexchange.com/a/12138/42888

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

Однако это плохая идея по другой причине: управление ключами. К ключам подписи и ключам шифрования предъявляются разные требования с точки зрения резервного копирования, управления доступом, отказа от авторства и т. Д. Резервным вариантом для ключа подписи в случае катастрофического события является его уничтожение, чтобы избежать подделок в будущем, поэтому ключ подписи не требуется активно поддерживается. И наоборот, запасным вариантом ключа шифрования является его хранение для расшифровки существующих документов, поэтому для него необходимо надежное резервное копирование.

Чтобы ответить на ваш вопрос, вы можете:

  1. Сгенерируйте ключ RSA как извлекаемый,
  2. Экспортируйте его в pcks8 или jwk
  3. Импортируйте его дважды как неизвлекаемый: key1- ›RSA-OAEP, key2-› RSA-PSS
  4. Уничтожьте оригинальный извлекаемый ключ

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

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

person pedrofb    schedule 11.12.2017
comment
Является ли управление ключами единственной причиной этого? (Закрытый) ключ сохраняется на сервере и рассматривается строго как ключ шифрования. Что касается вашего решения, то я пытался этого избежать, поскольку есть небольшой промежуток времени, когда ключ извлекается, и в идеале я хотел бы его устранить. - person LiraNuna; 11.12.2017
comment
Я предполагаю, что вы имеете в виду, что сохраняете открытый ключ на сервере. Я не вижу другого решения для дублирования ключа с помощью API Webcrypto, который временно имеет ключ как извлекаемый. Также проверьте это сообщение о подписи / шифровании тем же ключом. Управление ключами (резервное копирование, неотказуемость, срок действия, уничтожение ключей) является причиной, но они также указывают на потенциальные риски безопасности - person pedrofb; 12.12.2017