Поставщик SunRSASign для IBM SDK - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь запустить следующий код в Oracle 1.7 и IBM 1.7 JDK.

KeyPairGenerator serverKpairGen = KeyPairGenerator.getInstance("RSA");
        serverKpairGen.initialize(2048,new SecureRandom());
        KeyPair serverKpair = serverKpairGen.generateKeyPair();


        ByteArrayOutputStream baos = new ByteArrayOutputStream();
          ObjectOutputStream oos = new ObjectOutputStream(baos);

          oos.writeObject(serverKpair);
          oos.close();
          baos.close();

          byte[] serializedObject = baos.toByteArray();
          System.out.println(Base64.encode(serializedObject, false, false).length());

По умолчанию Oracle использует SunRsaSign в качестве поставщика по умолчанию для алгоритма RSA и где IBM использует IBMJCE

IBMJCE предоставляет пару ключей длиной 5100 байтов, а Oracle генерирует длину пары ключей почти 2800 байтов.

Я пытался установить SunJce в качестве поставщика, но он не поддерживает алгоритм RSA.

Есть ли в IBM SDK 1.6 или 1.7 возможность установить SunRSASign в качестве поставщика?Я заметил, что SunRSASign является частью rt.jar в Oracle Java. Можем ли мы уменьшить размер пары ServerKey в IBM Java до <4000 байт? </strong>

Можем ли мы получить длину размера ключа в IBM SDK, которая аналогична Oracle JDK?Есть ли другой поставщик по умолчанию в IBM, который дает меньший размер ключа с RSA2048.

1 Ответ

2 голосов
/ 14 марта 2019

Джеймс уже дал большую часть ответа в комментарии: используйте хранилище ключей PKCS # 12 для закрытого ключа.Это более безопасно, чем хранить его незащищенным.

Вы можете использовать getEncoded для получения кодировки открытых / закрытых ключей.Эта кодировка уже содержит длину, но вы можете захотеть добавить к ней 4-байтовую кодировку - закодированное целое число - тем не менее.Таким образом, ваша сериализация будет состоять из двух шагов:

Для Java SunRSASign она возвращает SubjectKeyIdentifier для открытого ключа и внутреннюю структуру PKCS # 8 для закрытого ключа.Хотя getEncoded не стандартизирован (на мой взгляд, это большая ошибка, но все в порядке), большинство других провайдеров все равно последуют примеру Sun / Oracle.

Какую бы дорогу ни выбрали провайдеры для getEncoded:

  1. обе структуры хорошо определены и стандартизированы, и
  2. их будет легче проанализировать, чем сериализацию объекта, специфичного для провайдера;
  3. наконец, они также будут намного меньше, чем структуры, которые вы 'в настоящее время обрабатывает.

Вы можете использовать KeyFactory, созданный с помощью getInstance("RSA"), чтобы получить ключи обратно.Спецификации ключа должны быть предоставлены с использованием X509EncodedKeySpec для SubjectPublicKey и PKCS8EncodedKeySpec для секретного ключа в кодировке PKCS # 8.

...