Liste complète de MessageDigest disponible dans le JDK

J’ai cherché haut et bas pour cela, mais je n’arrive pas à obtenir une réponse directe.

En Java, les MessageDigests disponibles sont déterminés par les fournisseurs de sécurité que vous avez configurés / installés. Mais en supposant qu’une installation normale de JDK8 (1.8.0_11 dans mon cas), quelle est la liste des algorithmes de hachage disponibles? D’après les exemples de la documentation, il est évident que MD5, SHA1 et SHA-256 sont disponibles, mais il me semble impossible d’obtenir une liste complète faisant autorité.

Cette liste existe-t-elle ou comment puis-je me renseigner pour mon installation particulière?

En plus de la réponse de JB, je voudrais proposer une solution qui interroge le runtime sur les algorithmes disponibles. Cette méthode est bien sûr facilement convertie en une méthode pour Cipher , SecureRandom , Mac , KeyAgreement , KeyFactory ou tout autre type d’algorithme.

Programme

 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) { Ssortingng type = typeClass.getSimpleName(); List algos = new ArrayList<>(); Set 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) { Ssortingng algo = service.getAlgorithm(); System.out.printf("Algorithm name: \"%s\"%n", algo); } } // --- find aliases (inefficiently) Set keys = prov.keySet(); for (Object key : keys) { final Ssortingng prefix = "Alg.Alias." + type + "."; if (key.toSsortingng().startsWith(prefix)) { Ssortingng value = prov.get(key.toSsortingng()).toSsortingng(); System.out.printf("Alias: \"%s\" -> \"%s\"%n", key.toSsortingng().subssortingng(prefix.length()), value); } } } public static void main(Ssortingng[] args) { Provider[] providers = Security.getProviders(); for (Provider provider : providers) { showHashAlgorithms(provider, MessageDigest.class); } } } 

Sortie du fournisseur Sun

Ce code générera la sortie suivante pour Java 1.8. Notez qu’en raison d’une ancienne erreur des fournisseurs d’API, la version du fournisseur n’est présente que sous forme de double . C’est pourquoi il n’est pas possible de faire la distinction entre la version 1.80 et la version 1.8.0.

Les alias sont en dessous des implémentations réelles. Certains de ces alias sont des identificateurs d’object ou des OID en notation par points . Ces identificateurs d’object sont utilisés pour indiquer des algorithmes à partir de formats de données codés ASN.1 tels que des certificates X5.09v3 tels qu’ils sont utilisés dans SSL / TLS. Par exemple, 1.3.14.3.2.26 est la notation par points pour {iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) hashAlgorithmIdentifier(26)} et l’alias pour 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" 

Sortie du fournisseur Bouncy Castle

Sortie pour Bouncy Castle (non demandée, incluse à titre de comparaison):

  --- 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" 

La documentation dit:

Ces algorithmes sont décrits dans la section MessageDigest de la documentation sur le nom d’algorithme standard pour Java Cryptography Architecture.

Le document lié contient la ligne suivante, juste après la table des matières:

Remarque: La documentation des fournisseurs Oracle contient des informations spécifiques sur le fournisseur et l’algorithme.

Et le document lié contient la liste complète des algorithmes MessageDigest fournis par chaque fournisseur.

En plus de la réponse de Maarten Bodewes: J’avais besoin d’un tel algorithme et j’ai écrit une méthode, collectant une liste sortingée par noms de tous les algorithmes et alias disponibles. Il utilise l’API de stream de java8. S’il vous plaît, n’hésitez pas à l’utiliser où vous voulez. À votre santé.

 public static List getAvailableAlgorithms() { final Ssortingng digestClassName = MessageDigest.class.getSimpleName(); final Ssortingng aliasPrefix = "Alg.Alias." + digestClassName + "."; return Arrays.stream(getProviders()) .flatMap(prov -> { final Set 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::toSsortingng) .filter(k -> k.startsWith(aliasPrefix)) .map(k -> Ssortingng.format("\"%s\" -> \"%s\"", k.subssortingng(aliasPrefix.length()), prov.get(k).toSsortingng())) .collect(Collectors.toCollection(() -> algorithms)); return algorithms.stream(); }) .sorted(Ssortingng::compareTo) .collect(Collectors.toList()); }