JDK中可用的MessageDigest的完整列表 [英] Complete list of MessageDigest available in the JDK

查看:165
本文介绍了JDK中可用的MessageDigest的完整列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



在Java中,可用的MessageDigests取决于哪些您已配置/安装的安全提供程序。但是假设只是一个正常的JDK8安装(在我的情况下为1.8.0_11),什么是可用的哈希算法列表?从文档中的示例,很明显MD5,SHA1和SHA-256是可用的,但我似乎不能得到一个完整的,权威的列表。



解决方案

除了JB的答案,我想要提出一个解决方案,查询运行时可用的算法。这种方法当然很容易转换为 Cipher SecureRandom Mac KeyAgreement KeyFactory 或任何其他类型 p>

计划



  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<>();

设置< 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:algos){
String algo = service.getAlgorithm();
System.out.printf(Algorithm name:\%s\%n,algo);


}
}

// ---查找别名(效率低下)
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 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证书)的算法。例如, 1.3.14.3.2.26 {iso(1)identify-organization(3)oiw(14)secsig )algorithm(2)hashAlgorithmIdentifier(26)} 和SHA / SHA-1的别名。

  ---提供商SUN,版本1.80 --- 
算法名称:MD2
算法名称:MD5
算法名称:SHA
算法名称:SHA-224
算法名称:SHA-256
算法名称:SHA-384
算法名称: b别名:SHA-1 - > SHA
别名:OID.1.3.14.3.2.26 - > SHA
别名:1.3.14.3.2.26 - > SHA
别名:OID.2.16.840.1.101.3.4.2.4 - > SHA-224
别名:OID.2.16.840.1.101.3.4.2.3 - > SHA-512
别名:OID.2.16.840.1.101.3.4.2.2 - > SHA-384
别名:OID.2.16.840.1.101.3.4.2.1 - > SHA-256
别名: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
别名:SHA1 - > SHA



Bouncy Castle提供商输出



Bouncy Castle的输出(不要求,包括以供比较):

  --- BC,版本1.51 --- 
算法名称:GOST3411
算法名称:MD2
算法名称:MD4
算法名称:MD5
算法名称:SHA-1
算法名称:RIPEMD128
算法名称:RIPEMD160
算法名称:RIPEMD256
算法名称:RIPEMD320 b $ b算法名称:SHA-224
算法名称:SHA-256
算法名称:SHA-384
算法名称: b算法名称: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
算法名称: -1024-1024
算法名称:SM3
算法名称:TIGER
算法名称:WHIRLPOOL
别名: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


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.

Does this list exist, or how do I go about finding out for my particular install?

解决方案

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 type of algorithm.

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

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.

The aliases are below the actual implementations. Some of these aliases are Object Identifiers or 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.

 --- 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):

 --- 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中可用的MessageDigest的完整列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆