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

ski*_*ppy 32 java encryption cryptography javax.crypto

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

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

ski*_*ppy 28

一旦我有一个提供者列表,如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));
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,我使用相同的方法,但使用正则表达式在多个提供程序中寻找算法。在大多数情况下,最好查看列表,因为文档可能已过时(或者在许多情况下为null)。棘手的事情是知道这些算法实际上是什么,因为任何地方都没有提供任何解释。请注意,如果仅检查算法是否已实现,则可能要从列表中删除许多“别名”。 (2认同)

JB *_*zet 18

Cipher.getInstance()的文档说:

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

单击该链接将指向Provider文档,该文档具有以下记录的方法getServices():

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

然后单击链接将指向具有getAlgorithm()方法的Provider文档.

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

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


mvm*_*vmn 5

看来这才是您真正需要的:

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

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


Rod*_*Rob 5

  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将回退到相应的默认值。

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
Run Code Online (Sandbox Code Playgroud)

另请参见JDK doc密码算法名称

  1. 要获取可用的TLS密码套件的列表,请使用以下代码:

$ 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
Run Code Online (Sandbox Code Playgroud)