我正在使用Cipher.getInstance(String algorithm)进行密码实现。我的印象是,我可以传递的可用算法名称根据类路径中存在的库而有所不同。

我想编写一个简单的程序,该程序可以在不同的类路径下运行,其中列出了可用的Cipher算法名称。我需要调用什么方法来获取此列表?

有帮助吗?

解决方案

一旦有了JB Nizet的帖子中所述的提供程序列表,我仍然没有算法列表。我发现每个提供程序都充当“属性”对象,并且“属性”对算法名称进行编码。我尚不完全清楚这是否是寻找它们的正确方法,以及所有其他属性的确切含义,但我只是编写了一个例程,将所有属性喷入System.out并为各种字符串grepped来描述什么我一直在寻找,直到找到它。 通用标签

其他提示

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 doc密码算法名称

    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)。

这是我的版本,基于 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top