1. Обзор
В этом кратком руководстве мы узнаем о классе Cipher
в Java. Затем мы увидим, как составить список доступных алгоритмов шифрования и их поставщиков.
2. Класс шифрования
Класс Cipher
, расположенный в пакете javax.crypto
, является ядром инфраструктуры Java Cryptography Extension (JCE). Эта структура предоставляет набор криптографических шифров для шифрования, дешифрования и хэширования данных.
3. Список алгоритмов шифрования
Мы можем создать экземпляр объекта шифрования, вызвав статический метод Cipher.getInstance()
с именем запрошенного преобразования в качестве аргумента:
Cipher cipher = Cipher.getInstance("AES");
В некоторых случаях нам нужно получить список доступных алгоритмов шифрования и их поставщиков. Например, мы хотим проверить, доступен ли конкретный алгоритм на основе библиотек, присутствующих в пути к классам.
Во- первых, нам нужно получить список зарегистрированных провайдеров с помощью метода Security.getProviders()
. Затем вызов метода getServices()
для объекта Provider
вернет неизменяемый набор всех сервисов, поддерживаемых этим Provider
:
for (Provider provider : Security.getProviders()) {
for (Provider.Service service : provider.getServices()) {
String algorithm = service.getAlgorithm();
// ...
}
}
Список доступных алгоритмов:
SHA3-224
NONEwithDSA
DSA
JavaLoginConfig
DSA
SHA3-384
SHA3-256
SHA1withDSA
...
Однако не все перечисленные алгоритмы поддерживаются как преобразование статическим методом Cipher.getInstance()
. Например, создание экземпляра объекта шифрования с помощью алгоритма хеширования SHA3-224
вызовет исключение NoSuchAlgorithmException:
Cipher cipher = Cipher.getInstance("SHA3-224");
Давайте посмотрим на сообщение об исключении во время выполнения:
java.security.NoSuchAlgorithmException: Cannot find any provider supporting SHA3-224
Итак, нам нужно отфильтровать список и сохранить сервисы с типом Cipher
. Мы можем использовать поток Java для фильтрации и сбора списка имен совместимых алгоритмов:
List<String> algorithms = Arrays.stream(Security.getProviders())
.flatMap(provider -> provider.getServices().stream())
.filter(service -> "Cipher".equals(service.getType()))
.map(Provider.Service::getAlgorithm)
.collect(Collectors.toList());
// ...
Результат будет примерно таким:
AES_192/CBC/NoPadding
AES_192/OFB/NoPadding
AES_192/CFB/NoPadding
AESWrap_192
PBEWithHmacSHA224AndAES_256
AES_192/ECB/NoPadding
AES_192/GCM/NoPadding
ChaCha20-Poly1305
PBEWithHmacSHA384AndAES_128
AES_128/ECB/NoPadding
AES_128/OFB/NoPadding
AES_128/CBC/NoPadding
...
4. Вывод
В этом уроке мы впервые узнали о классе Cipher
. Затем мы научились составлять список доступных алгоритмов шифрования.
Как обычно, все примеры доступны на GitHub .