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

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

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

Ответы [ 4 ]

26 голосов
/ 17 февраля 2012

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

import java.security.*;

for (Provider provider: Security.getProviders()) {
  System.out.println(provider.getName());
  for (String key: provider.stringPropertyNames())
    System.out.println("\t" + key + "\t" + provider.getProperty(key));
}
18 голосов
/ 17 февраля 2012

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

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

Нажатие на ссылку приводит к документу Provider, который имеет метод getServices () , задокументированный:

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

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

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

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

2 голосов
/ 03 июня 2019

Мой однострочный совет:

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

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

TLS_AES_128_GCM_SHA256
TLS_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_DSS_WITH_AES_128_CBC_SHA
1 голос
/ 21 сентября 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...