Как заставить Java использовать поставщика услуг безопасности?

Я написал собственный поставщик безопасности для AES/CBC/PKCS5Padding. Это прекрасно работает.

Какие настройки мне нужно добавить в Provider, чтобы Java распознала его как действительный поставщик для вышеуказанного алгоритма? У меня уже есть

public class FooBarProvider extends Provider {
  public FooBarProvider() {
    super("FooBar", 1.0, "Provider for AES.");
    put("Cipher.AES", "foo.bar.AESCipher");
  }
}

где последним аргументом является фактический CipherSpi, который выполняет работу. Где я могу зарегистрировать тот факт, что он поддерживает CBC и PKCS5Padding? В настоящее время запрос о соответствующем Cipher не возвращает экземпляр моего класса:

Security.insertProviderAt(new FooBarProvider(), 1);
Cipher cip = Cipher.getInstance("AES/CBC/PKCS5Padding");
System.out.println(cip.getProvider()); //prints "SunJCE version 1.7"

Ответ 1

Написание кода является самой простой частью процесса. Вы уже заявили, что ваши классы обеспечивают реализацию Cipher для AES. Эта строка:

put("Cipher.AES", "foo.bar.AESCipher");

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

Сказав это, написать код было легкой частью. Вы создаете шифр, поэтому вам нужно будет подписать JAR, прежде чем он сможет быть установлен и настроен как поставщик. Поскольку этот процесс несколько задействован, я не буду копировать его здесь, скорее я отсылаю вас к Руководству Oracle по внедрению поставщика. Это отличный источник для этой задачи.

Если вы следуете руководству и по-прежнему имеете проблемы, вам может потребоваться загрузить и установить JCE Unlimited Strength Policy, соответствующую вашему установленному JDK.

Ответ 2

Документация Java Crypto описывает механизмы регистрации класса Provider:

Короткий вариант:

  • Поместите JAR поставщика в путь к классам или в каталог расширений для установки Java.
  • Зарегистрировать поставщика:
    • отредактируйте файл конфигурации java.security (в установке Java) или
    • во время выполнения вызовите Security.addProvider или Security.insertProviderAt.