SHA1 da Python a Java

di il
3 risposte

SHA1 da Python a Java

Ho la seguente linea di codice Python che funziona egregia:

print hashlib.sha1("pippo").hexdigest()
e che stampa:

d012f68144ed0f121d3cc330a17eec528c2e7d59

Ho cercato in giro qualcosa in Java che restituisse lo stesso risultato. Ho trovato questo:


public static String SHAsum(byte[] convertme) {
   MessageDigest md = MessageDigest.getInstance("SHA-1"); //This could also be SHA1withDSA, no exception handling
   return new String(md.digest(convertme));
}
Ma il mio riadattamento non da' lo stesso risultato del Python:

MessageDigest md = MessageDigest.getInstance("SHA-1");
String pippo = "pippo";
byte[] b = pippo.getBytes("UTF-8");
System.out.println(md.digest(b));
che stampa: [B@16eb31c
Che non e' proprio la stessa cosa

Qualcuno mi sa dire come ottenere lo stesso risultato del Python?

Grazie

3 Risposte

  • Re: SHA1 da Python a Java

    morellik ha scritto:


    new String(md.digest(convertme))
    Questo non solo è "spaventoso" (in senso negativo) ... ma è proprio sbagliatissimo!
    Il digest per SHA-1 ti fornisce un array di 20 byte. Questi byte NON ha senso usarli per costruire un String ... non rappresentano caratteri.

    morellik ha scritto:


    System.out.println(md.digest(b));
    che stampa: [B@16eb31c
    Gli array non ridefiniscono il toString ... rimane il toString di Object che è in grado di fornire solo quella forma.

    Ripeto: tu hai un digest fatto da 20 byte. Ciascun byte lo devi trasformare in una stringa con 2 cifre esadecimali. Nel framework standard di Java non c'è un metodo apposta per fare questo partendo da un array byte[]

    Puoi farlo "a mano", con poche righe di codice. O ci sono librerie esterne come la Apache Commons Codec che ha un comodo metodo Hex.encodeHexString
  • Re: SHA1 da Python a Java

    Questo è corretto:
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    public class ProvaSha1 {
        public static void main(String[] args) {
            try {
                byte[] input = "pippo".getBytes("UTF-8");
                byte[] digest = sha1(input);
                String hex = toHexString(digest);
                
                System.out.println(hex);    // d012f68144ed0f121d3cc330a17eec528c2e7d59
            } catch (Exception e) {
                System.err.println(e);
            }
        }
        
        public static byte[] sha1(byte[] input) throws NoSuchAlgorithmException {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            return md.digest(input);
        }
        
        public static String toHexString(byte[] bytes) {
            StringBuilder buf = new StringBuilder();
            
            for (byte b : bytes) {
                buf.append(String.format("%02x", b));
            }
            
            return buf.toString();
        }
    }
    NOTE:
    1) Richiede Java 5 (x StringBuilder, format e for-each)
    2) Se si vuole l'hex in maiuscolo basta mettere %02X invece che %02x
  • Re: SHA1 da Python a Java

    Grazie 1000!
Devi accedere o registrarti per scrivere nel forum
3 risposte