Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    39

    [MD5]errore generazione md5 da stringa:

    Ciao a tutti, con il seguente codice converto una stringa in md5.
    Il risultato è errato, in quanto mi viene generata una stringa più lunga di 128 bit...
    Sapete aiutarmi?

    Grazie mille in anticipo.
    Mauro.

    codice:
    ...
    public static String md5( String source )
      {
        try
        {
         MessageDigest md = MessageDigest.getInstance( "MD5" );
         byte[] bytes = md.digest( source.getBytes() );
         return getString( bytes );
        }
        catch( Exception e )
        {
         e.printStackTrace();
         return null;
        }
      }
    ...
    public static void main( String[] args )
      {	
        if( args.length < 1 )
        {
    	 System.out.println("Non hai inserito la password da criptare... \n Esempio: \n java HashUtils password");
         System.exit( 0 );
        }
        String word = args[ 0 ];	
        System.out.println( "Word: " + word );
        System.out.println( " MD5: " + HashUtils.md5( word ) );    
      }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    39
    Dimenticavo...

    Questo è l'output generato:

    codice:
    Word: pippo
    MD5: 12-136-2-139-243-170-106-106-20-62-216-70-242-190-30-164

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    ci sarà qualche di conversione (getBytes dovrebbe creare valori da -128 a 127). Si può sistemare la cosa creando uno StringBuffer di comodo

    codice:
    StringBuffer sbuf = new StringBuffer();
    e quindi facendo l'append dei dati trasformati in esadecimale:

    codice:
    for (int i = 0; i < bytes.length; i++) {
      sbuf.append(Integer.toHexString(bytes[i] & 0xFF));
    }
    return sbuf.toString();
    prova un po' così
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Aggiungo una cosa molto importante:

    byte[] bytes = md.digest( source.getBytes() );

    getBytes() codifica la stringa in una sequenza di byte usando il charset di default della piattaforma. Questo significa che su piattaforme diverse o comunque con charset differenti, il valore di MD5 può essere radicalmente differente. E ovviamente potrebbe non andare bene (ma dipende da cosa si deve fare esattamente con il digest).

    Quando si convertono stringhe in byte (e viceversa) il charset è importantissimo!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    39
    Mi sa che mi sono incasinato con uno dei metodi privati: private static String getString( byte[] bytes ) e private static byte[] getBytes( String str ) ...

    Vi riporto l'intero file già pronto per l'uso, spero mi possiate aiutare:
    codice:
    import java.util.*;
    import java.io.*;
    import java.security.*;
    import java.io.*;
    
    public class HashUtils
    {
      private static String getString( byte[] bytes )
      {
        StringBuffer sb = new StringBuffer();
        for( int i=0; i<bytes.length; i++ )
        {
          byte b = bytes[ i ];
          sb.append( ( int )( 0x00FF & b ) );
          if( i+1 <bytes.length )
          {
            sb.append( "-" );
          }
        }
        return sb.toString();
      }
    
      private static byte[] getBytes( String str )
      {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        StringTokenizer st = new StringTokenizer( str, "-", false );
        while( st.hasMoreTokens() )
        {
          int i = Integer.parseInt( st.nextToken() );
          bos.write( ( byte )i );
        }
        return bos.toByteArray();
      }
    
      public static String md5( String source )
      {
        try
        {
         MessageDigest md = MessageDigest.getInstance( "MD5" );
         byte[] bytes = md.digest( source.getBytes() );
         return getString( bytes );
        }
        catch( Exception e )
        {
         e.printStackTrace();
         return null;
        }
      }
    
      public static String sha( String source )
      {
        try
        {
         MessageDigest md = MessageDigest.getInstance( "SHA" );
         byte[] bytes = md.digest( source.getBytes() );
         return getString( bytes );
        }
        catch( Exception e )
        {
         e.printStackTrace();
         return null;
        }
      }
      
      public static String sha512( String source )
      {
        try
        {
         MessageDigest md = MessageDigest.getInstance( "SHA-512" );
         byte[] bytes = md.digest( source.getBytes() );
         return getString( bytes );
        }
        catch( Exception e )
        {
         e.printStackTrace();
         return null;
        }
      }
      
      public static File creaFile(String word)
      {
    	try
    	{
    		File f=new File("passwd.txt");
    		FileOutputStream fos=new FileOutputStream(f);
    		PrintStream ps=new PrintStream(fos);
    		ps.println("Hash con separatori: \n");
    		ps.println( "Word: " + word );
    		ps.println( " MD5: " + HashUtils.md5( word ));
    		ps.println( " SHA: " + HashUtils.sha( word ));
    		ps.println( " SHA-512: " + HashUtils.sha512( word )+"\n");   
    		
    		ps.println("Hash senza separatori: \n");
    		ps.println( "Word: " + word );
    		ps.println( " MD5: " + HashUtils.md5( word ).replaceAll("-","") );
    		ps.println( " SHA: " + HashUtils.sha( word ).replaceAll("-",""));
    		ps.println( " SHA-512: " + HashUtils.sha512( word ).replaceAll("-","") );   
    		return f;
    	}
    	 catch( Exception e )
        {
         e.printStackTrace();
         return null;
        }
    		
      }
    
      public static void main( String[] args )
      {	
        if( args.length < 1 )
        {
    	 System.out.println("Non hai inserito la password da criptare... \n Esempio: \n java HashUtils password");
         System.exit( 0 );
        }
        String word = args[ 0 ];
    	HashUtils.creaFile(word);
    	System.out.println( "Word: " + word );
        System.out.println( " MD5: " + HashUtils.md5( word ) );
        System.out.println( " SHA: " + HashUtils.sha( word ) );
    	System.out.println( " SHA-512: " + HashUtils.sha512( word ) );
      }
    }

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mauro81
    Mi sa che mi sono incasinato con uno dei metodi privati
    I tuoi metodi, dal punto di vista tecnico, sono corretti (se vogliamo fare i pignoli in una c'è un cast inutile e nell'altra bisognerebbe testare il range del int convertito dalla stringa).

    Comunque non è quello il formato in cui normalmente gli hash MD5 ecc.. vengono visualizzati. Un MD5 in genere viene visualizzato nella forma:

    2f486e208793be1c0a988e76c9347071
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    codice:
      private static String getString( byte[] bytes )
      {
        StringBuffer sb = new StringBuffer();
        for( int i=0; i<bytes.length; i++ )
        {
          byte b = bytes[ i ];
          sb.append( Integer.toHexString( 0xFF & b ) );
          if( i+1 <bytes.length )
          {
            sb.append( "-" );
          }
        }
        return sb.toString();
      }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Volendo formattare l'array di byte secondo il formato tipico di un MD5 e volendo usare le nuove funzionalità di Java 5:

    codice:
    public static String bytesToHexString (byte[] ar)
    {
        StringBuilder sb = new StringBuilder (ar.length*2);
        for (byte b : ar)
            sb.append (String.format ("%02X", b));
        return sb.toString ();
    }
    Ma si possono studiare soluzioni ancora più performanti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    39
    Grazie mille a tutti, con i vostri suggerimenti ho risolto il problema...

    Ciao,
    Mauro.

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.