Quel algorithme de hachage spécifique fait MessageDigest.getInstance ("SHA") retour?

MessageDigest.getInstance("SHA") semble fonctionner et me donne un MessageDigest, mais je ne peux pas dire à quel algorithme de me.

Est-ce SHA - 1 ou SHA-0 ou ..?


Je ne suis pas intéressé par ce qui se passe sur ma machine. Je veux savoir s'il retournera sha0 ou sha1 pour toutes les implémentations valides de Java (ou ce n'est pas défini).

27
demandé sur megazord 2013-02-16 01:23:48

2 réponses

La spécification JcE répertorie les noms standard qu'une implémentation est censée prendre en charge. "SHA-1" est spécifié, tout comme SHA-256, SHA-384 et SHA-512. "SHA", "SHA-0" et SHA-2 " ne sont pas des noms standard et peuvent donc ne pas être pris en charge du tout. Vous ne pouvez pas garantir ce que" SHA " retournera, le cas échéant, parce que ce n'est pas dans la norme.

24
répondu Simon G. 2013-02-15 22:55:52

SHA-0 est obsolète. Pour une utilisation avec Java JcE MessageDigest, SHA = = SHA-1 pour certains fournisseurs JCE. En passant, SHA-1 n'est pas considéré comme sécurisé avec les ordinateurs et la technologie d'aujourd'hui. SHA-512 est toujours sécurisé pour à peu près n'importe quoi. SHA-256 est ok pour la plupart des choses, encore.

Vous pouvez lister les protocoles disponibles dans la version Java que vous utilisez avec ce code. (Je l'ai ici ):

import java.security.Provider;
import java.security.Security;

public class JceLook {

    public static void main(String[] args) {
        System.out.println("Algorithms Supported in this JCE.");
        System.out.println("====================");
        // heading
        System.out.println("Provider: type.algorithm -> className" + "\n  aliases:" + "\n  attributes:\n");
        // discover providers
        Provider[] providers = Security.getProviders();
        for (Provider provider : providers) {
            System.out.println("<><><>" + provider + "<><><>\n");
            // discover services of each provider
            for (Provider.Service service : provider.getServices()) {
                System.out.println(service);
            }
            System.out.println();
        }
    }
}

Il affichera des informations comme celle-ci pour tous les différents algorithmes disponible. (Notez qu'il s'agit d'une sortie réelle du programme ci-dessus pour un niveau de mise à jour D'Oracle/Sun Java 6 et cela montre que SHA est équivalent à SHA-1 et SHA1. Vous pouvez passer l'une des trois chaînes à MessageDigest et obtenir le même résultat. Mais cela dépend du fournisseur de cryptographie (le JCE) et pourrait ne pas être le même.)

SUN: MessageDigest.SHA -> sun.security.provider.SHA
  aliases: [SHA-1, SHA1]
  attributes: {ImplementedIn=Software}

Si vous chargez des fournisseurs supplémentaires (par exemple BouncyCastle), ils les montreront aussi.

17
répondu Lee Meador 2013-02-15 21:42:51