当前位置: 首页 > 面试题库 >

JDK中可用的MessageDigest的完整列表

陈斌
2023-03-14
问题内容

我为此进行了高低搜寻,但似乎无法获得直接答案。

在Java中,可用的MessageDigest由您配置/安装的安全提供程序确定。但是,假设仅进行普通的JDK8安装(在我的情况下为1.8.0_11),可用的哈希算法列表是什么?从文档中的示例来看,很明显可以使用MD5,SHA1和SHA-256,但我似乎无法获得完整的权威列表。

该列表是否存在,或者我该如何找到适合我的特定安装的列表?


问题答案:

除了JB的答案之外,我还想提出一种解决方案,用于在运行时查询可用的算法。这个方法当然容易地转化为一个为CipherSecureRandomMacKeyAgreementKeyFactory或任何其他
类型 的算法。

程序

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提供程序输出

此代码将为Java
1.8生成以下输出。请注意,由于API提供程序存在一些过时的错误,提供程序版本仅以形式出现double。因此,无法区分1.80版还是1.8.0版。

别名低于实际的实现。其中一些别名是
标识符
的对象标识符或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 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"


 类似资料:
  • 问题内容: jdk中是否有 事实上的 不可变类的列表? 从技术上讲,不可变类包括明显的Integer,Double等。 事实不可变将包含例如java.lang.String-从技术上讲它可能是可变的,但事实并非如此。 另外,是否存在不可变的接口/抽象类(如javadoc中所述)? 如果您不能提供完整的列表,那么如果您知道一堆在其javadoc中声明不变性的类,我将很高兴。 问题答案: 我尝试尽我所

  • 如何强制spark中数据包的完全外部联接以使用Boradcast散列联接?下面是代码片段: 但是,当我使用“”作为联接类型时,spark出于某种未知原因决定使用。有人知道怎么解决这个问题吗?根据我在左外部联接中看到的性能,将有助于加快应用程序的速度。

  • 我正在为IntelliJ创建一个自定义插件,我想把它放在我的个人存储库中。然后我看了一下如何创建一个存储库,基本上我只需要创建一个文件,它应该包含以下元素: 并将其放在存储库文件夹/服务器中。然后,当我打开IntelliJ IDEA并查看插件列表时,我可以看到我的插件列表(一旦我将我的存储库添加到列表中)。但是,我看到其他插件有更多的信息,例如描述、更改注释、类别等。。。 在这两个链接,插件列表和

  • 通过示例来学习 RxJS 操作符 RxJS 操作符的完整列表,每个操作符都有着清晰的解释、相关资源和可执行的示例。 更喜欢按操作符类型进行分类? 内容 (按字母顺序) audit auditTime buffer bufferCount bufferTime :star: bufferToggle bufferWhen catch / catchError :star: combineAll co

  • 问题内容: 除了官方文档,我只发现了这篇文章。但是它很旧而且不完整(仅可用选项)。例如,我都找不到选项。 如果存在完整列表,在哪里可以找到? 问题答案: 您可以使用 打印所有选项及其默认值。如果您具有调试版本,则也可以使用此命令为各种选项打印注释: 附注:此博客文章中有大多数描述:http : //stas-blogspot.blogspot.bg/2011/07/most- complete-l

  • 我们正在用爪哇在后交后SQL之上构建一个Web应用程序。它相当大且成功,至少应该能够再运行几年。 不幸的是,我们(嗯,我)在设计过程的早期阶段犯了一个严重的错误:所有数据库ID都是整数,从一个共享序列中分发。 Java的max int是2^31-1,所以大约20亿。PostgreSQL的整数类型也是如此。该系统目前每天消耗大约10k个id,而且随着新用户的增加,这个速度还在加快。 总有一天,id会