Как я могу перечислить доступные алгоритмы шифрования?

StackOverflow https://stackoverflow.com/questions/9333504

Вопрос

Я получаю реализацию шифрования с помощью Cipher.getInstance(String algorithm).У меня сложилось впечатление, что доступные имена алгоритмов, которые я могу передать, отличаются в зависимости от того, какие библиотеки присутствуют в моем пути к классу.

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

Это было полезно?

Решение

Если у меня есть список поставщиков, как описано в сообщении JB Nizet, у меня все еще нет списка алгоритмов.Я обнаружил, что каждый поставщик функционирует как объект свойств, а свойства кодируют имена алгоритмов.Я не совсем понимаю, правильный ли это способ их поиска или нет, и что именно означают все остальные свойства, но я просто написал процедуру, которая извергает все свойства в System.out и ищет различные строки, описывающие, чтоИскал, пока не нашел.

родовое слово

Другие советы

Документ Cipher.getInstance () говорит:

<цитата>

Обратите внимание, что список зарегистрированных поставщиков можно получить через Метод Security.getProviders ()

При нажатии на ссылку открывается документ поставщика, в котором есть метод getServices () задокументировано:

<цитата>

Получите неизменяемый набор всех услуг, поддерживаемых этим поставщиком.

И нажатие на ссылку приводит к документу поставщика, в котором есть getAlgorithm () .

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

Какой бы метод вы ни выбрали, прочтение документации очень помогает.

  1. Чтобы получить список доступных имен преобразований шифра , используйте этот фрагмент кода:

TreeSet<String> algs = new TreeSet<>(); for (Provider provider : Security.getProviders()) { provider.getServices().stream().filter(s -> "Cipher".equals(s.getType())).map(Service::getAlgorithm).forEach(algs::add); } algs.stream().forEach(System.out::println);

Эти имена можно вызывать с помощью кода Cipher.getInstance().Если в записи отсутствует режим обратной связи или схема заполнения, JVM вернется к соответствующему значению по умолчанию.

родовое слово

см. также названия алгоритмов шифрования документов JDK

  1. Чтобы получить список доступных комплектов шифров TLS , используйте этот однострочник:

$ jrunscript -e "java.util.Arrays.asList(javax.net.ssl.SSLServerSocketFactory.getDefault().getSupportedCipherSuites()).stream().forEach(println)"

Какие выходы для JDK11:

родовое слово

Похоже, это то, что вам действительно нужно:

https://docs.oracle.com/javase/7/docs/api/java/security/Security.html#getAlgorithms(java.lang.String)

<цитата>

Возвращает набор строк, содержащий имена всех доступных алгоритмов или типов для указанной криптографической службы Java (например, Signature, MessageDigest, Cipher, Mac, KeyStore).

Вот моя версия, основанная на инструкциях из Атласский:

  • Для включения требуемого набора шифров или протокола он не включен по умолчанию.
  • Исключить набор шифров или протокол, которые считаются слишком слабыми для использования или для которых была обнаружена уязвимость.

    import java.util.Map;
    import java.util.TreeMap;
    
    import javax.net.ssl.SSLServerSocketFactory;
    
    public class Ciphers {
    
    public static void main(String[] args) {
        SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
    
        String[] defaultCiphers = ssf.getDefaultCipherSuites();
        String[] availableCiphers = ssf.getSupportedCipherSuites();
    
        Map<String, Boolean> ciphers = new TreeMap<>();
    
        for (String availableCipher : availableCiphers) {
            ciphers.put(availableCipher, Boolean.FALSE);
        }
    
        for (String defaultCipher : defaultCiphers) {
            ciphers.put(defaultCipher, Boolean.TRUE);
        }
    
        System.out.println("Default\tCipher");
        for (Map.Entry<String, Boolean> cipher : ciphers.entrySet()) {
            if (Boolean.TRUE.equals(cipher.getValue())) {
                System.out.print('*');
            } else {
                System.out.print(' ');
            }
    
            System.out.print('\t');
            System.out.println(cipher.getKey());
        }
    }
    }
    

Выходной сигнал:

Шифр по умолчанию

  • TLS_DHE_DSS_WITH_AES_128_CBC_SHA
  • TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
  • TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
  • TLS_DHE_DSS_WITH_AES_256_CBC_SHA
  • TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
  • TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
  • TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  • TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  • TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  • TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  • TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  • TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  • TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  • TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  • TLS_RSA_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_AES_128_CBC_SHA256
  • TLS_RSA_WITH_AES_128_GCM_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_AES_256_CBC_SHA256
  • TLS_RSA_WITH_AES_256_GCM_SHA384
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top