2013-02-15 5 views
25

MessageDigest.getInstance("SHA") scheint zu arbeiten und gibt mir eine MessageDigest, aber ich kann nicht sagen, welchen Algorithmus es mir gibt.Welchen spezifischen Hash-Algorithmus gibt MessageDigest.getInstance ("SHA") zurück?

Ist es SHA-1 oder SHA-0 oder ..?


Ich bin nicht daran interessiert, was auf meiner Maschine passiert. Ich möchte wissen, ob es sha0 oder sha1 für alle gültigen Implementierungen von Java zurückgibt (oder es ist nicht definiert).

+1

Der einfache Weg, um es herauszufinden, wäre zu verwenden, was zurückgegeben wird, um die Zeichenfolge "Der schnelle braune Fuchs springt über den faulen Hund" Hash und untersuchen Sie die Ausgabe. Wenn Sie erhalten 2fd4e1c6-7a2d28fc-ed849ee1-bb76e739-1b93eb12 "Dann hast du SHA-1. Lee Meadors Antwort zeigt eine programmatische Art zu sehen, was' SHA' ist ein Alias ​​für. –

+0

@NikBougalis, haben Sie auch überprüft, ob die gleiche Ausgabe sowohl für sha-0 und sha-1 passiert? Wie weiß ich, dass sie wahrscheinlich anders sind? Ich kann nirgends eine Beschreibung von sha-0 finden. – megazord

+2

Sie sind anders. –

Antwort

23

Die JCE Specification listet Standardnamen auf, die von einer Implementierung erwartet werden. "SHA-1" wird spezifiziert, ebenso wie SHA-256, SHA-384 und SHA-512. "SHA", "SHA-0" und SHA-2 "sind keine Standardnamen und werden daher möglicherweise überhaupt nicht unterstützt. Sie können nicht garantieren, was" SHA "zurückgibt, wenn überhaupt, weil es nicht im Standard ist.

+1

Sehr gute Antwort. Lassen Sie niemals so etwas im Zweifel und verwenden Sie den richtigen Namen, nicht einen "Alias" und wenn möglich, lassen Sie auch nichts auf Standardwerte (zB geben Sie immer "AES/CBC/PKCS5Padding" an, da "AES" zurückkommt ECB-Modus-Verschlüsselung für 'Cipher.getInstance()' in der SunJCE-Implementierung). –

+0

Danke, das ist, was ich gesucht habe. Mit anderen Worten, die Antwort auf meine eigentliche Frage ist "weder/noch undefiniert". – megazord

+1

Wenn ich dieses Problem richtig verstehe, dann sind "Standardnamen" gemeint, zum Beispiel "SHA-384" und "SHA-512", die verwendet werden können. In keiner Weise ist die Java-Plattform erforderlich, um diese Algorithmen zu unterstützen. JavaDoc von [MessageDigest] (http://docs.oracle.com/javase/8/docs/api/java/security/MessageDigest.html) und [diese URL] (http://docs.oracle.com/javase/ (Google "muss unterstützen") sagen beide, dass SHA-256 benötigt wird, aber nicht SHA-384 oder SHA-512. –

17

SHA-0 ist veraltet. Zur Verwendung mit Java JCE MessageDigest, SHA == SHA-1 für einige JCE-Provider. Übrigens wird SHA-1 mit den heutigen Computern und Technologien nicht als sicher angesehen. SHA-512 ist immer noch für so ziemlich alles sicher. SHA-256 ist für die meisten Dinge immer noch in Ordnung.

Sie können die Protokolle, die in der von Ihnen verwendeten Java-Version verfügbar sind, mit diesem Code auflisten. (Ich habe es here):

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

Es Informationen wie diese für die verschiedenen Algorithmen zur Verfügung zeigen. (Beachten Sie, dass dies die tatsächliche Ausgabe des obigen Programms für eine Update-Ebene von Oracle/Sun Java 6 ist und dass SHA SHA-1 und SHA1 entspricht. Sie können eine der drei Zeichenfolgen an MessageDigest übergeben und das gleiche Ergebnis erhalten . Aber das hängt von der Kryptographie Provider (die JCE) und möglicherweise nicht das gleiche sein.)

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

Wenn Sie weitere Anbieter zu laden (zB BouncyCastle) es die zu zeigen.

+0

Ich bin nicht daran interessiert, was auf meiner Maschine passiert. Ich möchte wissen, ob es sha0 oder sha1 für alle gültigen Implementierungen von Java zurückgibt (oder es ist nicht definiert). – megazord

+0

Ich vermute, dass es nicht definiert ist, aber ich bezweifle sehr, dass * irgendeine * Implementierung von Java 'SHA-0' zurückgeben würde. Es wurde zurückgezogen, nachdem ein Konstruktionsfehler entdeckt und korrigiert wurde, was "SHA-1" erzeugte. –

+0

"Aber das hängt vom Kryptographie-Provider (JCE) ab und ist vielleicht nicht derselbe." WTF. Wie können Sie dann sicher sein, dass Sie die richtige Hash-Funktion aufrufen? @NikBougalis Ich wäre etwas überrascht, da ich keine Anwendungen kenne, die SHA-0 benötigen, aber Vorsicht ist besser als Nachsicht. – megazord

Verwandte Themen