2013-02-15 3 views
25

MessageDigest.getInstance("SHA") sembra funzionare e mi dà un MessageDigest, ma non posso dire quale algoritmo mi sta dando.Quale specifico algoritmo di hash restituisce MessageDigest.getInstance ("SHA")?

È SHA-1 o SHA-0 o ..?


Non sono interessato a ciò che accade sulla mia macchina. Voglio sapere se restituirà sha0 o sha1 per tutte le implementazioni valide di Java (o è indefinito).

+1

Il modo più semplice per capire è quello di utilizzare qualsiasi cosa viene restituito all'hash la stringa "La volpe marrone veloce salta sul cane pigro" ed esaminare l'output. Se ottieni '2fd4e1c6-7a2d28fc-ed849ee1-bb76e739-1b93eb12 "allora hai SHA-1. La risposta di Lee Meador mostra un modo programmatico di vedere che cosa è" SHA "per lo –

+0

@NikBougalis, hai anche verificato se lo stesso risultato si verifica sia per sha-0 che per sha-1? so che potrebbero essere diversi? Non riesco nemmeno a trovare una descrizione di sha-0 ovunque – megazord

+2

Sono diversi –

risposta

23

Il JCE Specification elenca i nomi standard supportati da un'implementazione. "SHA-1" è specificato, così come SHA-256, SHA-384 e SHA-512. "SHA", "SHA-0" e SHA-2 "non sono nomi standard e pertanto potrebbero non essere supportati affatto. Non puoi garantire quale" SHA "restituirà, se non del tutto, perché non è nello standard.

+1

Ottima risposta. Non lasciare mai nulla di tutto ciò in dubbio e usare il vero nome, non un "alias" e, se possibile, non lasciare mai nulla ai valori predefiniti (ad es. Specificare sempre "AES/CBC/PKCS5Padding" come "AES" restituirà " Crittografia in modalità ECB per 'Cipher.getInstance()' nell'implementazione SunJCE). –

+0

Grazie, questo è quello che stavo cercando. Quindi, in altre parole, la risposta alla mia domanda reale è "né/non definito". – megazord

+1

Se ho ben capito questo problema, ciò a cui si fa riferimento è "nomi standard", ad esempio "SHA-384" e "SHA-512" che possono essere utilizzati. Ma in nessun modo è necessaria la piattaforma Java per supportare questi algoritmi. JavaDoc di [MessageDigest] (http://docs.oracle.com/javase/8/docs/api/java/security/MessageDigest.html) e [questo URL] (http://docs.oracle.com/javase/ 8/docs/technotes/guides/security/StandardNames.html) (google "deve supportare") entrambi affermano che è necessario SHA-256, ma non SHA-384 o SHA-512. –

17

SHA-0 è obsoleto. Da utilizzare con Java JCE MessageDigest, SHA == SHA-1 per alcuni provider JCE. A proposito, SHA-1 non è considerato sicuro con i computer e la tecnologia di oggi. SHA-512 è ancora sicuro per quasi tutto. SHA-256 è ok per molte cose, ancora.

È possibile elencare i protocolli disponibili nella versione Java che si sta utilizzando con questo codice. (I got it 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(); 
     } 
    } 
} 

Mostrerà le informazioni in questo modo per tutti i vari algoritmi disponibili. (Si noti che questo è l'output effettivo del programma sopra riportato per alcuni livelli di aggiornamento di Oracle/Sun Java 6 e mostra che SHA è equivalente a SHA-1 e SHA1. È possibile passare qualsiasi delle tre stringhe a MessageDigest e ottenere lo stesso risultato . Ma questo dipende dal provider Cryptography (ICC) e potrebbe non essere lo stesso.)

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

Se si caricano altri provider (ad esempio BouncyCastle) mostrerà anche quelle.

+0

Non sono interessato a cosa succede sulla mia macchina. Voglio sapere se restituirà sha0 o sha1 per tutte le implementazioni valide di Java (o è indefinito). – megazord

+0

Sospetto che non sia definito, ma dubito fortemente che * qualsiasi * implementazione di Java restituisca 'SHA-0'. È stato ritirato dopo che un difetto di progettazione è stato scoperto e corretto, producendo 'SHA-1'. –

+0

"Ma questo dipende dal provider di crittografia (JCE) e potrebbe non essere lo stesso." WTF. Allora come puoi essere sicuro di aver chiamato la giusta funzione di hash? @NikBougalis Sarei un po 'sorpreso dal momento che non conosco nessuna applicazione che richieda SHA-0, ma è meglio prevenire che curare. – megazord