2013-02-15 11 views
25

MessageDigest.getInstance("SHA") wydaje się działać i daje mi MessageDigest, ale nie mogę powiedzieć, jaki algorytm mi daje.Jaki konkretny algorytm skrótu zwraca MessageDigest.getInstance ("SHA")?

Czy to SHA-1, czy SHA-0 lub ..?


Nie interesuje mnie, co dzieje się na moim komputerze. Chcę wiedzieć, czy zwróci sha0 lub sha1 dla wszystkich poprawnych implementacji Java (lub nieokreślonych).

+1

Łatwo to rozgryźć, wykorzystując to, co powrócisz, do haszowania napisu "Szybki brązowy lis przeskoczył nad leniwym psem" i zbadać wynik. Jeśli dostaniesz '2fd4e1c6-7a2d28fc-ed849ee1-bb76e739-1b93eb12 'wtedy masz SHA-1. Odpowiedź Lee Meadora pokazuje programowy sposób zobaczenia, co' SHA' jest aliasem dla. –

+0

@NikBougalis, czy też sprawdziłeś, czy to samo dzieje się dla obu sha-0 i sha-1? czy wiem, że prawdopodobnie będą inne? Nie mogę nawet znaleźć nigdzie opisu sha-0 – megazord

+2

Są różne –

Odpowiedz

23

Lista JCE Specification zawiera listę nazw standardowych, których wdrożenie ma obsługiwać. "SHA-1" jest określony, podobnie jak SHA-256, SHA-384 i SHA-512. "SHA", "SHA-0" i SHA-2 "nie są standardowymi nazwami i dlatego mogą nie być obsługiwane w ogóle.Nie możesz zagwarantować, że" SHA "powróci, jeśli w ogóle coś, ponieważ nie jest w standardzie.

+1

Bardzo dobra odpowiedź. Nigdy nie zostawiaj czegoś takiego w wątpliwość i używaj prawdziwego imienia, a nie "aliasu" i jeśli to możliwe, nigdy nie zostawiaj niczego w domyślnych wartościach (np. Zawsze określ "AES/CBC/PKCS5Padding" 'jako' "AES" 'zwróci Szyfrowanie w trybie EBC dla 'Cipher.getInstance()' w implementacji SunJCE). –

+0

Dziękuję, tego właśnie szukałem. Innymi słowy, odpowiedź na moje aktualne pytanie brzmi "nie/nieokreślony". – megazord

+1

Jeśli rozumiem ten problem poprawnie, to, co określasz, to "standardowe nazwy", na przykład "SHA-384" i "SHA-512", które mogą być używane. Ale w żaden sposób nie jest wymagana platforma Java do obsługi tych algorytmów. JavaDoc [MessageDigest] (http://docs.oracle.com/javase/8/docs/api/java/security/MessageDigest.html) i [ten adres URL] (http://docs.oracle.com/javase/ 8/docs/technotes/guides/security/StandardNames.html) (google "musi obsługiwać") mówią, że SHA-256 jest wymagany, ale nie SHA-384 lub SHA-512. –

17

SHA-0 jest przestarzały. Do użytku z Java JCE MessageDigest, SHA == SHA-1 dla niektórych dostawców JCE. Nawiasem mówiąc, SHA-1 nie jest uważany za bezpieczny dla dzisiejszych komputerów i technologii. SHA-512 jest nadal bezpieczny na prawie wszystko. SHA-256 jest w porządku dla większości rzeczy, nadal.

Możesz wyświetlić listę protokołów dostępnych w wersji Java, której używasz z tym kodem. (Mam go 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(); 
     } 
    } 
} 

To pokaże informacje, takie jak ten dla wszystkich różnych algorytmów dostępnych. (Zauważ, że jest to rzeczywisty wynik z powyższego programu dla niektórych poziomów aktualizacji Oracle/Sun Java 6 i pokazuje, że SHA jest równoważne SHA-1 i SHA1. Możesz przekazać dowolny z trzech łańcuchów do MessageDigest i uzyskać ten sam wynik . Ale to zależy od dostawcy Cryptography (tej jednostki) i może nie być takie same.)

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

Jeśli załadować dodatkowe dostawców (np BouncyCastle) pokaże ci też.

+0

Nie interesuje mnie, co dzieje się na moim komputerze. Chcę wiedzieć, czy zwróci sha0 lub sha1 dla wszystkich poprawnych implementacji Java (lub nieokreślonych). – megazord

+0

Podejrzewam, że jest nieokreślony, ale bardzo wątpię, że * dowolna * implementacja Javy zwróci 'SHA-0'. Został wycofany po wykryciu i skorygowaniu defektu konstrukcyjnego, wytwarzając "SHA-1". –

+0

"Ale to zależy od dostawcy kryptografii (JCE) i może nie być takie samo." WTF. Więc jak możesz być pewny, że nazywasz właściwą funkcję mieszającą? @NikBougalis Byłbym nieco zaskoczony, ponieważ nie znam żadnych aplikacji, które wymagają SHA-0, ale lepiej być bezpiecznym niż żałować. – megazord