如何列出可用的密码算法?

时间:2012-02-17 18:31:47

标签: java encryption cryptography javax.crypto

我正在使用Cipher.getInstance(String algorithm)获得Cipher实现。我的印象是,我可能传递的可用算法名称因我的类路径中存在的库而不同。

我想编写一个简单的程序,我可以使用不同的类路径运行,列出可用的Cipher算法名称。获取此列表需要调用哪种方法?

5 个答案:

答案 0 :(得分:25)

如果我有一个提供者列表,如JB Nizet的帖子中所述,我仍然没有算法列表。我发现每个Provider都作为Properties对象运行,Properties对算法名称进行编码。我不完全清楚这是否是寻找它们的正确方法,以及所有其他属性究竟是什么意思,但我只是编写了一个例程,它将所有属性喷射到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));
}

答案 1 :(得分:17)

Cipher.getInstance()的文件说:

  

请注意,可以通过以下方式检索已注册的提供商列表   Security.getProviders()方法

点击该链接即可转到提供商的文档,该文档的方法getServices()记录在:

  

获取此提供商支持的所有服务的不可修改的集合。

点击该链接会指向提供商的文档,该文档具有getAlgorithm()方法。

请注意,这是一种非常经验的方法。更合乎逻辑的方法是阅读您正在使用的加密库的文档。它必须包含支持的算法列表。

无论您选择哪种方法,阅读文档都会有很大帮助。

答案 2 :(得分:2)

我的一线建议是:

$ 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

答案 3 :(得分:1)

您真正需要的是这样的

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

  

返回一组字符串,其中包含指定Java密码服务的所有可用算法或类型的名称(例如Signature,MessageDigest,Cipher,Mac,KeyStore)。

答案 4 :(得分:0)

这是基于Atlassian的指示的我的版本:

  • 要包括密码套件或协议,您需要未启用 默认情况下。
  • 排除被认为的密码套件或协议 太弱而无法使用,或者已发现漏洞。

    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
  •