Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [JAVA] md5 hash

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    12

    [JAVA] md5 hash

    Ciao a tutti!
    Sto facendo una prova in java...voglio calcolare l'md5 di una stringa di caratteri:
    codice:
    import java.security.MessageDigest; 
    import java.security.NoSuchAlgorithmException;
    
    public class md5 { 
    public static void main(String[] args) {
    int [] id = {0, 29, 49, 50, 51, 17}; 
    String hex_char = ""; 
    int i =0; 
    while (i != 6){ 
    hex_char += (char)id[i]; 
    i++; 
    } 
    String sessionid = hex_char; 
    byte[] defaultBytes = sessionid.getBytes(); 
    try{ 
    MessageDigest algorithm = MessageDigest.getInstance("MD5"); 
    algorithm.reset(); 
    algorithm.update(defaultBytes); 
    byte messageDigest[] = algorithm.digest(); 
    StringBuffer hexString = new StringBuffer(); 
    for (i=0;i<messageDigest.length;i++) { 
    hexString.append(Integer.toHexString(0xFF & messageDigest[i])); 
    } 
    String foo = messageDigest.toString(); 
    System.out.println("md5: "+hexString.toString() + " (" + hexString.toString().length() + ")"); 
    sessionid=hexString+""; 
    }
    catch(NoSuchAlgorithmException nsae){ } 
    }
     }
    Ora, se uso caratteri "normali" (simboli, numeri e lettere) tutto ok...ma se, come in questo caso uso caratteri tipo NULL, GS, DC1 etc etc mi restituisce un hash sbagliato. Per esempio il codice postato sopra mi restituisce in output:
    codice:
    md5: 891fb11b23301a9664dcaf92e1e7f (29)
    quindi addirittura ottengo un md5 di 29 caratteri e non di 32...

    Dove sbaglio?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Sbagli forum, innanzitutto.

    Java ha un forum dedicato.

    Sposto.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] md5 hash

    Originariamente inviato da MrHahn
    codice:
    byte[] defaultBytes = sessionid.getBytes();
    Innanzitutto questo getBytes() usa il charset di "default" della piattaforma. Quale sia ... dipende appunto dal sistema sui cui sta girando la applicazione.
    Quando si convertono stringhe in sequenze di byte (e viceversa) bisognerebbe sempre porsi la questione del charset. Sopratutto in questo caso, perché un hash può cambiare radicalmente se cambia il charset (e quindi la sequenza di byte ottenuta).
    Quindi se vuoi che sia "stabile" e noto, usane uno ben preciso es. getBytes("UTF-8")

    Originariamente inviato da MrHahn
    codice:
    byte messageDigest[] = algorithm.digest(); 
    StringBuffer hexString = new StringBuffer(); 
    for (i=0;i<messageDigest.length;i++) { 
    hexString.append(Integer.toHexString(0xFF & messageDigest[i])); 
    }
    quindi addirittura ottengo un md5 di 29 caratteri e non di 32...
    Il MD5 fornisce un digest sempre di 128 bit = 16 byte. Spetta a te "formattarlo" in stringa facendo in modo che ad esempio, se vuoi rappresentarlo in hex (come è tipico), ci siano sempre 2 digit esadecimali per ogni byte.

    Ma non è così se usi toHexString (o un altro toString), perché NON mettono gli zeri iniziali superflui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    12
    Ok, il primo problema l'ho risolto facendo così:
    codice:
    StringBuffer hexString = new StringBuffer();
        	for (i =0;i<messageDigest.length;i++) {
        		String hex=Integer.toHexString(0xFF & messageDigest[i]);
        		if(hex.length()==1) hexString.append('0');
        		hexString.append(hex);
        	}
    non sarà elegantissimo ma funziona

    Ho fatto qualche prova mettendo sia UTF-8 sia UTF-16 ed effettivamente l'md5 cambia totalmente...onestamente questa cosa la ignoravo. Mi sapresti indicare il charset da utilizzare per ottenere l'md5 corretto di stringhe contenenti quei caratteri "speciali" (quali EOT,FS...)?

    Grazie mille...mi sei stato davvero d'aiuto


    EDIT: Grazie ancora! ho risolto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.