Java JDK中可用的MessageDigest的完整列表

Java JDK中可用的MessageDigest的完整列表,java,hash,cryptography,Java,Hash,Cryptography,我到处寻找这个问题,但似乎找不到一个直截了当的答案 在Java中,可用的消息摘要由您配置/安装的安全提供程序决定。但是假设只是一个普通的JDK8安装(在我的例子中是1.8.011),可用的哈希算法列表是什么?从文档中的示例来看,很明显MD5、SHA1和SHA-256是可用的,但我似乎无法获得完整的权威列表 是否存在此列表,或者如何查找我的特定安装?文档中说: Java加密体系结构标准算法名称文档的MessageDigest部分描述了这些算法 目录后面包含以下行: 注意:Oracle Provid

我到处寻找这个问题,但似乎找不到一个直截了当的答案

在Java中,可用的消息摘要由您配置/安装的安全提供程序决定。但是假设只是一个普通的JDK8安装(在我的例子中是1.8.011),可用的哈希算法列表是什么?从文档中的示例来看,很明显MD5、SHA1和SHA-256是可用的,但我似乎无法获得完整的权威列表


是否存在此列表,或者如何查找我的特定安装?

文档中说:

Java加密体系结构标准算法名称文档的MessageDigest部分描述了这些算法

目录后面包含以下行:

注意:Oracle Providers文档包含特定的提供程序和算法信息


并且包含每个提供者提供的MessageDigest算法的完整列表。

除了JB的答案之外,我还想提出一个查询运行时中可用算法的解决方案。当然,这种方法很容易转换为
密码
安全随机
Mac
密钥协商
密钥工厂
或任何其他类型的算法

节目 弹性城堡提供者输出 Bouncy Castle的输出(未要求,包括用于比较):

——提供商BC,1.51版--
算法名称:“GOST3411”
算法名称:“MD2”
算法名称:“MD4”
算法名称:“MD5”
算法名称:“SHA-1”
算法名称:“RIPEMD128”
算法名称:“RIPEMD160”
算法名称:“RIPEMD256”
算法名称:“RIPEMD320”
算法名称:“SHA-224”
算法名称:“SHA-256”
算法名称:“SHA-384”
算法名称:“SHA-512”
算法名称:“SHA-512/224”
算法名称:“SHA-512/256”
算法名称:“SHA3-224”
算法名称:“SHA3-256”
算法名称:“SHA3-384”
算法名称:“SHA3-512”
算法名称:“Skein-256-128”
算法名称:“Skein-256-160”
算法名称:“Skein-256-224”
算法名称:“Skein-256-256”
算法名称:“Skein-512-128”
算法名称:“Skein-512-160”
算法名称:“Skein-512-224”
算法名称:“Skein-512-256”
算法名称:“Skein-512-384”
算法名称:“Skein-512-512”
算法名称:“Skein-1024-384”
算法名称:“Skein-1024-512”
算法名称:“Skein-1024-1024”
算法名称:“SM3”
算法名称:“老虎”
算法名称:“漩涡”
别名:“SHA256”->“SHA-256”
别名:“SHA224”->“SHA-224”
别名:“1.3.36.3.2.3”->“RIPEMD256”
别名:“1.3.36.3.2.2”->“RIPEMD128”
别名:“1.3.36.3.2.1”->“RIPEMD160”
别名:“1.2.156.197.1.401”->“SM3”
别名:“SHA512”->“SHA-512”
别名:“SHA1”->“SHA-1”
别名:“GOST”->“GOST3411”
别名:“2.16.840.1.101.3.4.2.6”->“SHA-512/256”
别名:“2.16.840.1.101.3.4.2.5”->“SHA-512/224”
别名:“2.16.840.1.101.3.4.2.4”->“SHA-224”
别名:“2.16.840.1.101.3.4.2.3”->“SHA-512”
别名:“2.16.840.1.101.3.4.2.2”->“SHA-384”
别名:“2.16.840.1.101.3.4.2.1”->“SHA-256”
别名:“1.2.643.2.2.9”->“GOST3411”
别名:“1.3.14.3.2.26”->“SHA-1”
别名:“SHA512/224”->“SHA-512/224”
别名:“GOST-3411”->“GOST3411”
别名:“SHA512256”->“SHA-512/256”
别名:“SHA384”->“SHA-384”
别名:“SM3”->“SM3”
别名:“SHA”->“SHA-1”
别名:“1.2.840.113549.2.5”->“MD5”
别名:“1.2.840.113549.2.4”->“MD4”
别名:“1.2.840.113549.2.2”->“MD2”

除了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());
}
公共静态列表getAvailableAlgorithms()
{
最后一个字符串digestClassName=MessageDigest.class.getSimpleName();
最后一个字符串aliasPrefix=“Alg.Alias.”+digestClassName+”;
返回Arrays.stream(getProviders())
.flatMap(prov->{
最终集算法=新哈希集(0);
prov.getServices().stream()
.filter->digestClassName.equalsIgnoreCase(s.getType())
.map(服务::getAlgorithm)
.collect(收集器.toCollection(()->算法));
prov.keySet().stream()
.map(对象::toString)
.filter(k->k.startsWith(别名前缀))
.map(k->String.format(“\%s\”->\%s\”,k.substring(aliasPrefix.length()),prov.get(k.toString()))
.collect(收集器.toCollection(()->算法));
返回算法。stream();
})
.sorted(字符串::compareTo)
.collect(Collectors.toList());
}

要仅获取算法名称,而不需要别名或任何其他信息,最简单的方法是:

import java.security.Security;
import java.util.Set;

...

Set<String> algorithms = Security.getAlgorithms("MessageDigest");
导入java.security.security;
导入java.util.Set;
...
Set algorithms=Security.getAlgorithms(“MessageDigest”);
自Java 1.4以来,一行程序:

Arrays.stream(Security.getProviders())
            .flatMap(provider -> provider.getServices().stream())
            .filter(s -> MessageDigest.class.getSimpleName().equals(s.getType()))
            .map(Provider.Service::getAlgorithm)
            .collect(Collectors.toList());

您可以通过以下代码找到JVM支持的确切列表:

java.lang.System.out.println(java.security.Security.getAlgorithms("MessageDigest"));

如果您有一个最新的JRE/JDK,那么您应该有可用的JavaScript,这样您就可以启动“jjs”(它应该与java/javac/…)位于同一目录中),并在提示符处键入上述命令。显然,如果您在JVM中安装了特殊的提供程序(如Bouncy Castle),则在启动“jjs”时需要相应地配置这些提供程序。

可能重复的@davidPost我不同意重复,这些重复不会出现在搜索结果中。我们可以在JDK中为任何类型的
服务
创建一个通用Q/a,但如果没有它,询问每种类型的算法应该都可以。@owlstead我知道另一个答案,因为我在不久前玩的东西中使用了它的一些代码。所以我可以搜索“密码”来找到它。@DavidPostill好吧,那太好了,但是你会认为其他人都能做同样的事情吗?我正在寻找
SecureRandom
imp
java.lang.System.out.println(java.security.Security.getAlgorithms("MessageDigest"));