1. Обзор
В этом кратком руководстве мы узнаем о классе шифров в Java. Затем мы посмотрим, как перечислить доступные алгоритмы шифрования и их поставщиков.
2. Класс Шифра
Класс Cipher , расположенный в пакете javax.crypto , является ядром фреймворка Java Cryptography Extension (JCE). Этот фреймворк предоставляет набор криптографических шифров для шифрования, дешифрования и хэширования данных.
3. Перечисление алгоритмов шифрования
Мы можем создать экземпляр объекта шифра, вызвав Cipher.getInstance() статический метод с именем запрашиваемого преобразования в качестве аргумента:
Cipher cipher = Cipher.getInstance("AES");
В некоторых случаях нам нужно получить список доступных алгоритмов шифрования и их поставщиков. Например, мы хотим проверить, доступен ли конкретный алгоритм на основе библиотек, присутствующих в пути к классам.
Во-первых, нам нужно получить список зарегистрированных поставщиков с помощью метода Security.getProviders () . Затем вызов метода getservice() на объекте 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 для фильтрации и сбора списка имен совместимых алгоритмов:
Listalgorithms = 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 .