2014-12-17 18 views
6

Ho provato il seguente codice per produrre un digest SHA1 di una stringa:Non uscita Java SHA1 lo stesso comando di Linux sha1sum

import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.util.Formatter; 

public class SHA1 { 
    private static String encryptPassword(String password) 
    { 
     String sha1 = ""; 
     try 
     { 
      MessageDigest crypt = MessageDigest.getInstance("SHA-1"); 
      crypt.reset(); 
      crypt.update(password.getBytes("UTF-8")); 
      sha1 = byteToHex(crypt.digest()); 
     } 
     catch(NoSuchAlgorithmException e) 
     { 
      e.printStackTrace(); 
     } 
     catch(UnsupportedEncodingException e) 
     { 
      e.printStackTrace(); 
     } 
     return sha1; 
    } 

    private static String byteToHex(final byte[] hash) 
    { 
     Formatter formatter = new Formatter(); 
     for (byte b : hash) 
     { 
      formatter.format("%02x", b); 
     } 
     String result = formatter.toString(); 
     formatter.close(); 
     return result; 
    } 

    public static void main(String args[]){ 
     System.out.println(SHA1.encryptPassword("test")); 

    } 
} 

Questo codice è basato su this question e this other question. Si noti che questo non è un duplicato di quelle domande poiché riguardano la formattazione dell'output.

Il problema è che produce un risultato diverso rispetto all'esecuzione della stessa stringa di input tramite il comando sha1sum in Linux ->echo test|sha1sum.

Java uscita codice per "test" ->a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 sha1sum nel terminale Linux per "test" ->4e1243bd22c66e76c2ba9eddc1f91394e57f9f83

  • Perché non sono la stessa cosa?
  • Non la classe Java MessageDigest e l'utilità Linux sha1sum implementano lo stesso algoritmo?

risposta

15

Il problema è come si utilizza sha1sum sotto Linux con echo. Sta includendo il line feed. Per suddividere in fasi:

echo test > somefile 
sha1sum somefile 

vi mostrerà lo stesso risultato ... ma se si guarda a somefile vedrete che è byte lungo invece di 4. Modificare a sbarazzarsi del trailing line feed, esegui di nuovo sha1sum e vedrai la stessa risposta fornita da Java.

Se si utilizza l'opzione -n per echo, dovrebbe andare bene:

$ echo -n test | sha1sum 
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 - 
+0

si ottiene un cappello segreto per rispondere entro 5 minuti? Bene :-) –

+1

Ho avuto lo stesso problema con 'sha1sum' stesso, non correlato a Java; il mio problema era con PHP. Sono grato di averti trovato la risposta. – Manngo