我得到了一个带有Cipher.getInstance(String algorithm)
的密码实现。我的印象是,我可能传递的可用算法名称因类路径中存在的库而异。
我想写一个简单的程序,可以用不同的类路径运行,列出可用的密码算法名称。我需要调用什么方法才能获取此列表?
正如JB Nizet的帖子中所描述的那样,一旦我有了提供者列表,我仍然没有算法列表。我发现每个Provider都充当Properties对象,Properties对算法名称进行编码。我不完全清楚这是否是查找它们的正确方法,也不完全清楚所有其他属性的确切含义,但我只是写了一个例程,将所有属性都吐到System.out中,并为描述我正在查找的内容的各种字符串进行grep,直到找到为止。
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));
}
要获得可用密码转换名称的列表,请使用以下代码片段:
Set<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.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
另请参阅JDK doc密码算法名称
要获得可用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
Cipher.getInstance()的文档说:
请注意,注册提供商的列表可以通过Security.getProviders()方法
点击链接将指向Provider的文档,其中有一个方法getServices(),由记录
获取此提供程序支持的所有服务的不可修改集。
单击该链接将指向Provider的文档,该文档具有getAlgorithm()方法。
请注意,这是一种非常实证的方法。更合乎逻辑的方法是阅读您正在使用的加密库的文档。它必须包含支持的算法列表。
无论你选择什么方法,阅读文档都会有很大帮助。
看起来这才是您真正需要的:
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("DefaulttCipher"); 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_cdsa_WITH_AES_128_CBC_SHA
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_cdsa_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_cdsa_WITH_AES_256_CBC_SHA
- TLS_ECDHE_cdsa_WITH_AES_256_CBC_SHA384
- TLS_ECDHE_cdsa_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_edcsa_WITH_AES_128_CBC_SHA
- TLS_ECDH_edcsa_WITH_AES_128_CBC_SHA256
- TLS_ECDH_edcsa_WITH_AES_128_GCM_SHA256
- TLS_ECDH_edcsa_WITH_AES_256_CBC_SHA
- TLS_ECDH_edcsa_WITH_AES_256_CBC_SHA384
- TLS_ECDH_edcsa_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