Wie kann ich die verfügbaren Verschlüsselungsalgorithmen auflisten?
-
27-10-2019 - |
Frage
Ich erhalte eine Verschlüsselungsimplementierung mit Cipher.getInstance(String algorithm)
.Ich habe den Eindruck, dass die verfügbaren Algorithmusnamen, die ich übergeben kann, je nach den in meinem Klassenpfad vorhandenen Bibliotheken unterschiedlich sind.
Ich möchte ein einfaches Programm schreiben, das ich mit verschiedenen Klassenpfaden ausführen kann, in denen die verfügbaren Namen des Cipher-Algorithmus aufgelistet sind.Welche Methode müsste ich aufrufen, um diese Liste zu erhalten?
Lösung
Sobald ich eine Liste von Anbietern habe, wie in JB Nizets Beitrag beschrieben, habe ich immer noch keine Liste von Algorithmen.Ich fand heraus, dass jeder Anbieter als Eigenschaftenobjekt fungiert und die Eigenschaften die Algorithmusnamen codieren.Ich bin mir nicht ganz sicher, ob dies die richtige Art ist, nach ihnen zu suchen oder nicht, und was genau alle anderen Eigenschaften bedeuten, aber ich habe gerade eine Routine geschrieben, die alle Eigenschaften an System.out ausspuckte und nach verschiedenen Zeichenfolgen suchte, die beschreiben, wasIch habe gesucht, bis ich es gefunden habe.
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));
}
Andere Tipps
Das Dokument von Cipher.getInstance () sagt:
Beachten Sie, dass die Liste der registrierten Anbieter über die abgerufen werden kann Security.getProviders () -Methode
Wenn Sie auf den Link klicken, gelangen Sie zum Dokument des Anbieters mit einer Methode getServices () dokumentiert durch:
Holen Sie sich einen nicht veränderbaren Satz aller von diesem Anbieter unterstützten Dienste.
Wenn Sie auf den Link klicken, gelangen Sie zum Dokument des Anbieters mit einem getAlgorithm () Methode.
Beachten Sie, dass dies eine sehr empirische Methode ist. Eine logischere Methode wäre, die Dokumentation der von Ihnen verwendeten Kryptobibliotheken zu lesen. Es muss die Liste der unterstützten Algorithmen enthalten.
Unabhängig von der gewählten Methode hilft das Lesen der Dokumentation sehr.
- Verwenden Sie diesen Codeausschnitt, um eine Liste der verfügbaren Chiffretransformationsnamen zu erhalten:
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);
Diese Namen sind kompatibel, um über
Cipher.getInstance()
aufgerufen zu werden.Wenn einem Eintrag der Feedback-Modus oder das Auffüllschema fehlt, greift die JVM auf den entsprechenden Standard zurück.AES AESWrap AESWrap_128 AESWrap_192 AESWrap_256 AES_128/CBC/NoPadding AES_128/CFB/NoPadding AES_128/ECB/NoPadding AES_128/GCM/NoPadding AES_128/OFB/NoPadding AES_192/CBC/NoPadding AES_192/CFB/NoPadding AES_192/ECB/NoPadding AES_192/GCM/NoPadding AES_192/OFB/NoPadding AES_256/CBC/NoPadding AES_256/CFB/NoPadding AES_256/ECB/NoPadding AES_256/GCM/NoPadding AES_256/OFB/NoPadding ARCFOUR Blowfish ChaCha20 ChaCha20-Poly1305 DES DESede DESedeWrap PBEWithHmacSHA1AndAES_128 PBEWithHmacSHA1AndAES_256 PBEWithHmacSHA224AndAES_128 PBEWithHmacSHA224AndAES_256 PBEWithHmacSHA256AndAES_128 PBEWithHmacSHA256AndAES_256 PBEWithHmacSHA384AndAES_128 PBEWithHmacSHA384AndAES_256 PBEWithHmacSHA512AndAES_128 PBEWithHmacSHA512AndAES_256 PBEWithMD5AndDES PBEWithMD5AndTripleDES PBEWithSHA1AndDESede PBEWithSHA1AndRC2_128 PBEWithSHA1AndRC2_40 PBEWithSHA1AndRC4_128 PBEWithSHA1AndRC4_40 RC2 RSA RSA/ECB/PKCS1Padding
Siehe auch Namen der JDK-Dokumentverschlüsselungsalgorithmen
- Verwenden Sie diesen Einzeiler, um eine Liste der verfügbaren TLS-Verschlüsselungssuiten zu erhalten:
$ jrunscript -e "java.util.Arrays.asList(javax.net.ssl.SSLServerSocketFactory.getDefault().getSupportedCipherSuites()).stream().forEach(println)"
Welche Ausgaben für 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
- Verwenden Sie diesen Einzeiler, um eine Liste der verfügbaren TLS-Verschlüsselungssuiten zu erhalten:
Scheint so, als ob Sie das wirklich brauchen:
Gibt eine Reihe von Zeichenfolgen zurück, die die Namen aller verfügbaren Algorithmen oder Typen für den angegebenen Java-Kryptografiedienst enthalten (z. B. Signature, MessageDigest, Cipher, Mac, KeyStore).
Hier ist meine Version basierend auf den Anweisungen von Atlassian :
- Um eine Chiffresuite oder ein Protokoll einzuschließen, das Sie benötigen, ist es nicht aktiviert standardmäßig.
-
Zum Ausschließen einer berücksichtigten Verschlüsselungssuite oder eines Protokolls zu schwach für die Verwendung oder für die eine Sicherheitsanfälligkeit entdeckt wurde.
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()); } } }
Ausgabe:
Standardverschlüsselung
- 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