Java JDK 中可用的 MessageDigest 的完整列表
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/24979557/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Complete list of MessageDigest available in the JDK
提问by mjuarez
I've searched high and low for this, but I can't seem to get a straight answer.
我对此进行了高低搜索,但似乎无法得到直接的答案。
In Java, the available MessageDigests are determined by which security providers you have configured/installed. But assuming just a normal JDK8 install (1.8.0_11 in my case), what's the list of hash algorithms that are available? From examples in the docs, it's obvious MD5, SHA1 and SHA-256 are available, but I can't seem to get a complete, authoritative list.
在 Java 中,可用的 MessageDigest 由您配置/安装的安全提供程序决定。但假设只是一个普通的 JDK8 安装(在我的例子中是 1.8.0_11),可用的哈希算法列表是什么?从文档中的示例来看,很明显 MD5、SHA1 和 SHA-256 可用,但我似乎无法获得完整的权威列表。
Does this list exist, or how do I go about finding out for my particular install?
这个列表是否存在,或者我如何去寻找我的特定安装?
采纳答案by Maarten Bodewes
In addition to JB's answer, I would like to propose a solution that queries the runtime for available algorithms. This method is of course easily converted to one for Cipher
, SecureRandom
, Mac
, KeyAgreement
, KeyFactory
or any other typeof algorithm.
除了 JB 的回答之外,我还想提出一个解决方案,该解决方案可以查询运行时以获取可用算法。这个方法当然容易地转化为一个为Cipher
,SecureRandom
,Mac
,KeyAgreement
,KeyFactory
或任何其他类型的算法。
Program
程序
import java.security.MessageDigest;
import java.security.Provider;
import java.security.Provider.Service;
import java.security.Security;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class ShowHashAlgorithms {
private static final void showHashAlgorithms(Provider prov, Class<?> typeClass) {
String type = typeClass.getSimpleName();
List<Service> algos = new ArrayList<>();
Set<Service> services = prov.getServices();
for (Service service : services) {
if (service.getType().equalsIgnoreCase(type)) {
algos.add(service);
}
}
if (!algos.isEmpty()) {
System.out.printf(" --- Provider %s, version %.2f --- %n", prov.getName(), prov.getVersion());
for (Service service : algos) {
String algo = service.getAlgorithm();
System.out.printf("Algorithm name: \"%s\"%n", algo);
}
}
// --- find aliases (inefficiently)
Set<Object> keys = prov.keySet();
for (Object key : keys) {
final String prefix = "Alg.Alias." + type + ".";
if (key.toString().startsWith(prefix)) {
String value = prov.get(key.toString()).toString();
System.out.printf("Alias: \"%s\" -> \"%s\"%n",
key.toString().substring(prefix.length()),
value);
}
}
}
public static void main(String[] args) {
Provider[] providers = Security.getProviders();
for (Provider provider : providers) {
showHashAlgorithms(provider, MessageDigest.class);
}
}
}
Sun provider output
Sun 提供程序输出
This code will generate the following output for Java 1.8. Note that because of some old mistake by the API providers, the provider version is only present as a double
. It is not possible to distinguish between version 1.80 or version 1.8.0 because of this.
此代码将为 Java 1.8 生成以下输出。请注意,由于 API 提供者的一些旧错误,提供者版本仅作为double
. 因此无法区分 1.80 版或 1.8.0 版。
The aliases are below the actual implementations. Some of these aliases are Object Identifiersor OID's in dot notation. These OID's are used to indicate algorithms from within ASN.1 encoded data formats such as X5.09v3 certificates as used within SSL/TLS. For instance, 1.3.14.3.2.26
is the dot notation for {iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) hashAlgorithmIdentifier(26)}
and the alias for SHA/SHA-1.
别名低于实际实现。其中一些别名是点符号中的对象标识符或 OID 。这些 OID 用于指示 ASN.1 编码数据格式中的算法,例如 SSL/TLS 中使用的 X5.09v3 证书。例如,是SHA/SHA-1的点符号和别名。1.3.14.3.2.26
{iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) hashAlgorithmIdentifier(26)}
--- Provider SUN, version 1.80 ---
Algorithm name: "MD2"
Algorithm name: "MD5"
Algorithm name: "SHA"
Algorithm name: "SHA-224"
Algorithm name: "SHA-256"
Algorithm name: "SHA-384"
Algorithm name: "SHA-512"
Alias: "SHA-1" -> "SHA"
Alias: "OID.1.3.14.3.2.26" -> "SHA"
Alias: "1.3.14.3.2.26" -> "SHA"
Alias: "OID.2.16.840.1.101.3.4.2.4" -> "SHA-224"
Alias: "OID.2.16.840.1.101.3.4.2.3" -> "SHA-512"
Alias: "OID.2.16.840.1.101.3.4.2.2" -> "SHA-384"
Alias: "OID.2.16.840.1.101.3.4.2.1" -> "SHA-256"
Alias: "2.16.840.1.101.3.4.2.4" -> "SHA-224"
Alias: "2.16.840.1.101.3.4.2.3" -> "SHA-512"
Alias: "2.16.840.1.101.3.4.2.2" -> "SHA-384"
Alias: "2.16.840.1.101.3.4.2.1" -> "SHA-256"
Alias: "SHA1" -> "SHA"
Bouncy Castle provider output
充气城堡提供程序输出
Output for Bouncy Castle (not asked for, included for comparison):
Bouncy Castle 的输出(不要求,包括用于比较):
--- Provider BC, version 1.51 ---
Algorithm name: "GOST3411"
Algorithm name: "MD2"
Algorithm name: "MD4"
Algorithm name: "MD5"
Algorithm name: "SHA-1"
Algorithm name: "RIPEMD128"
Algorithm name: "RIPEMD160"
Algorithm name: "RIPEMD256"
Algorithm name: "RIPEMD320"
Algorithm name: "SHA-224"
Algorithm name: "SHA-256"
Algorithm name: "SHA-384"
Algorithm name: "SHA-512"
Algorithm name: "SHA-512/224"
Algorithm name: "SHA-512/256"
Algorithm name: "SHA3-224"
Algorithm name: "SHA3-256"
Algorithm name: "SHA3-384"
Algorithm name: "SHA3-512"
Algorithm name: "Skein-256-128"
Algorithm name: "Skein-256-160"
Algorithm name: "Skein-256-224"
Algorithm name: "Skein-256-256"
Algorithm name: "Skein-512-128"
Algorithm name: "Skein-512-160"
Algorithm name: "Skein-512-224"
Algorithm name: "Skein-512-256"
Algorithm name: "Skein-512-384"
Algorithm name: "Skein-512-512"
Algorithm name: "Skein-1024-384"
Algorithm name: "Skein-1024-512"
Algorithm name: "Skein-1024-1024"
Algorithm name: "SM3"
Algorithm name: "TIGER"
Algorithm name: "WHIRLPOOL"
Alias: "SHA256" -> "SHA-256"
Alias: "SHA224" -> "SHA-224"
Alias: "1.3.36.3.2.3" -> "RIPEMD256"
Alias: "1.3.36.3.2.2" -> "RIPEMD128"
Alias: "1.3.36.3.2.1" -> "RIPEMD160"
Alias: "1.2.156.197.1.401" -> "SM3"
Alias: "SHA512" -> "SHA-512"
Alias: "SHA1" -> "SHA-1"
Alias: "GOST" -> "GOST3411"
Alias: "2.16.840.1.101.3.4.2.6" -> "SHA-512/256"
Alias: "2.16.840.1.101.3.4.2.5" -> "SHA-512/224"
Alias: "2.16.840.1.101.3.4.2.4" -> "SHA-224"
Alias: "2.16.840.1.101.3.4.2.3" -> "SHA-512"
Alias: "2.16.840.1.101.3.4.2.2" -> "SHA-384"
Alias: "2.16.840.1.101.3.4.2.1" -> "SHA-256"
Alias: "1.2.643.2.2.9" -> "GOST3411"
Alias: "1.3.14.3.2.26" -> "SHA-1"
Alias: "SHA512/224" -> "SHA-512/224"
Alias: "GOST-3411" -> "GOST3411"
Alias: "SHA512256" -> "SHA-512/256"
Alias: "SHA384" -> "SHA-384"
Alias: "SM3" -> "SM3"
Alias: "SHA" -> "SHA-1"
Alias: "1.2.840.113549.2.5" -> "MD5"
Alias: "1.2.840.113549.2.4" -> "MD4"
Alias: "1.2.840.113549.2.2" -> "MD2"
回答by JB Nizet
The documentation says:
文档说:
These algorithms are described in the MessageDigest section of the Java Cryptography Architecture Standard Algorithm Name Documentation
这些算法在 Java Cryptography Architecture Standard Algorithm Name Documentation 的 MessageDigest 部分中进行了描述
The linked documentcontains the following line, right after the table of contents:
该链接的文档包含以下行,表的内容之后:
Note: The Oracle Providers Documentation contains specific provider and algorithm information.
注意:Oracle Providers 文档包含特定的提供程序和算法信息。
And the linked documentcontains the complete list of MessageDigest algorithms provided by each provider.
而链接的文档中包含的各供应商提供的消息摘要算法的完整列表。
回答by Netherwire
In addition to Maarten Bodewes's answer: I needed such algorithm and I wrote a method, collecting a sorted by name list of all available algorithms and aliases. It uses java8's stream API. Please, feel free to use it wherever you want. Cheers.
除了 Maarten Bodewes 的回答:我需要这样的算法,我写了一个方法,收集所有可用算法和别名的按名称列表排序。它使用 java8 的流 API。请随意使用它。干杯。
public static List<String> getAvailableAlgorithms()
{
final String digestClassName = MessageDigest.class.getSimpleName();
final String aliasPrefix = "Alg.Alias." + digestClassName + ".";
return Arrays.stream(getProviders())
.flatMap(prov -> {
final Set<String> algorithms = new HashSet<>(0);
prov.getServices().stream()
.filter(s -> digestClassName.equalsIgnoreCase(s.getType()))
.map(Service::getAlgorithm)
.collect(Collectors.toCollection(() -> algorithms));
prov.keySet().stream()
.map(Object::toString)
.filter(k -> k.startsWith(aliasPrefix))
.map(k -> String.format("\"%s\" -> \"%s\"", k.substring(aliasPrefix.length()), prov.get(k).toString()))
.collect(Collectors.toCollection(() -> algorithms));
return algorithms.stream();
})
.sorted(String::compareTo)
.collect(Collectors.toList());
}
回答by user85421
To get just the algorithm names, without aliases or any additional information, the simplest is:
要仅获取算法名称,而无需别名或任何其他信息,最简单的方法是:
import java.security.Security;
import java.util.Set;
...
Set<String> algorithms = Security.getAlgorithms("MessageDigest");
since Java 1.4
从 Java 1.4 开始
回答by Daniel Kec
One liner:
一个班轮:
Arrays.stream(Security.getProviders())
.flatMap(provider -> provider.getServices().stream())
.filter(s -> MessageDigest.class.getSimpleName().equals(s.getType()))
.map(Provider.Service::getAlgorithm)
.collect(Collectors.toList());
回答by J-F Cloutier
You can find the exact list supported by your JVM with the following code:
您可以使用以下代码找到 JVM 支持的确切列表:
java.lang.System.out.println(java.security.Security.getAlgorithms("MessageDigest"));
If you have a recent JRE/JDK, you should have JavaScript available thus you can launch "jjs" (which should be in the same directory as java/javac/...) and type the above command at the prompt. Obviously, if you have installed special providers (like Bouncy Castle) in your JVM, you will need to configure them accordingly when launching "jjs".
如果您有最新的 JRE/JDK,您应该有可用的 JavaScript,因此您可以启动“jjs”(它应该与 java/javac/... 在同一目录中)并在提示符下键入上述命令。显然,如果您在 JVM 中安装了特殊的提供程序(如 Bouncy Castle),则需要在启动“jjs”时相应地配置它们。