2013-12-14 6 views
1

Чтобы реализовать шифрование с использованием Java, я использую JCE, что приятно и интересно. Мне сказали, что лучше выбрать поставщика криптона, чем использовать по умолчанию.Java Crypto Api - как выбрать поставщика шифрования

Мне нужно выбрать поставщиков как для генерации симметричных ключей. используемый этот код (с помощью AES в режиме CBC):

Key sharedKey = (KeyGenerator.getInstance("AES/CBC/PKCS5PADDING", PROVIDER1).generateKey(); 

И для асимметричного текста шифрования, используемого этого код (с использованием RSA в режиме ECB):

Cipher rsaEncryptor = Cipher.getInstance("RSA/ECB/PKCS1Padding",PROVIDER2); 

Мой вопрос, как я должен выберите PROVIDER1 и PROVIDER2?

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

Кто-нибудь?

+0

Обратите внимание, что для генерации ключей AES требуется ключ KeyGenerator, независимо от того, для чего используются эти ключи. Поэтому указание «CBC/PKCS5Padding» 'не требуется, просто« AES »' должно быть достаточно ... –

ответ

3

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

Следующий абзац directly from the Oracle documentation:

Напоминание: Криптографические реализации в JDK распределены между несколькими различными поставщиками ("ВС", "SunJSSE", "SunJCE", "SunRsaSign") для обоих исторических причин и по видам предоставляемых услуг. Приложения общего назначения НЕ ДОЛЖНЫ запрашивать криптографические услуги у конкретных поставщиков. То есть:

getInstance("...", "SunJCE"); // not recommended 
    vs. 
getInstance("...");   // recommended 

Вы все еще можете управлять, чтобы позволить другим поставщикам, которые будут использоваться, давая им более высокий приоритет (более низкий показатель приоритета, 1 является наивысшим приоритетом) в файле java.security в пределах jre/lib/security путь вашей среды выполнения. Если вы хотите указать поставщика, используя getInstance("Algorithm", "Provider"), может быть хорошей идеей сделать конфигурацию строки поставщика (например, используя свойства и используя myConfig.getProperty("Provider")).

+0

Большое спасибо за подробный ответ, можете ли вы подробно рассказать о том, какие различия следует учитывать между разными провайдерами? Существуют ли различия в производительности, безопасности, использовании памяти? – Wasafa1

+0

Что все зависит. Я регулярно использую поставщиков PKCS # 11 в сочетании с сертифицированным аппаратным маркером FIPS или Common Criteria (например, смарт-карту). Это очевидно более безопасно, если применять правильно. Использование памяти обычно минимально для любого провайдера (по сравнению с имеющимися в настоящее время ульями ГБ). Для поставщиков программного обеспечения сравнение производительности должно, вероятно, осуществляться в конкретной конфигурации. Безопасность очень сложна для измерения, но я не буду полагаться на библиотеки, которые не выполняют ослепление RSA. Если вы не уверены, сохраните их по умолчанию, если они доступны. –

+0

спасибо, я продолжу расследование. – Wasafa1

 Смежные вопросы

  • Нет связанных вопросов^_^