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?

War es hilfreich?

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.

  1. 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

    1. 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
      

Scheint so, als ob Sie das wirklich brauchen:

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

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top