Question

La prochaine fonction dans MySQL

MD5 ('secret') génère 5ebe2294ecd0e0f08eab7690d2a6ee69

J'aimerais disposer d'une fonction Java pour générer le même résultat. Mais

public static String md5( String source ) {
    try {
        MessageDigest md = MessageDigest.getInstance( "MD5" );
        byte[] bytes = md.digest( source.getBytes("UTF-8") );
        return getString( bytes );
    } catch( Exception e )  {
        e.printStackTrace();
        return null;
    }
}

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();
}

génère

94-190-34-148-236-208-224-240-142-171-118-144-210-166-238-105
Était-ce utile?

La solution

Essayez d’encoder en base 16. Juste pour commencer ... 94 en base 16 est 5E.

** Edit: ** Essayez de modifier votre méthode getString:

private static String getString( byte[] bytes ) 
{
  StringBuffer sb = new StringBuffer();
  for( int i=0; i<bytes.length; i++ )     
  {
     byte b = bytes[ i ];
     String hex = Integer.toHexString((int) 0x00FF & b);
     if (hex.length() == 1) 
     {
        sb.append("0");
     }
     sb.append( hex );
  }
  return sb.toString();
}

Autres conseils

remplacer

sb.append( ( int )( 0x00FF & b ) );
if( i+1 <bytes.length ) {
    sb.append( "-" );
}

par

String hex = Integer.toHexString((int) 0x00FF & b);
if (hex.length == 1) sb.append("0");
sb.append( hex );

Cela peut être réduit à une seule ligne en utilisant les classes d’utilitaires de la bibliothèque Apache Commons Codec ( http: / /commons.apache.org/codec )

String md = org.apache.commons.codec.digest.DigestUtils.md5hex("whatever");

Ces deux sont égaux. Le Java semble être en décimal. Convertissez-le en hexadécimal.

Pensez à convertir vos octets décimaux en hexadécimal. Par exemple, 94 base 10 est 5e base 16.

C'est parce que la base est différente. Le résultat de MySQL MD5 est en base 16, alors que celui de Java MD5 est en base 10.

J'aimerais pouvoir vous aider davantage, mais mes calculs pue. Un de mes amis m'a aidé à générer une somme de contrôle base 10 à partir d'une somme de contrôle base 16 en PHP, mais j'ai perdu le script. J'espère que vous pourrez trouver votre réponse sur cette base.

String password = org.springframework.util.DigestUtils.md5DigestAsHex("password".getBytes())
System.out.println(password)

Regardez comment je le fais, le code est auto-explicable!

Code Java:

public static void main(String a[]) throws NoSuchAlgorithmException {
    String passClear = "cleartext";
    MessageDigest md5 = MessageDigest.getInstance("MD5"); // you can change it to SHA1 if needed!
    md5.update(passClear.getBytes(), 0, passClear.length());
    System.out.printf("MD5: %s: %s ", passClear, new BigInteger(1, md5.digest()).toString(16));
}

Sortie:

MD5: texte clair: 5ab677ec767735cebd67407005786016

Requête Mysql produisant le même hachage:

SELECT md5( 'cleartext' ); 

Sortie:

md5 ('cleartext')
5ab677ec767735cebd67407005786016

Plutôt que de réinventer la roue, essayez le codec Apache commons ( http://commons.apache.org/codec / ) qui gérera le codage hexadécimal pour vous avec Hex.encodeHex (octet [])

private String encodeAsMD5(String password) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] bytes = md.digest(password.getBytes());
        return new String(Hex.encodeHex(bytes));
    } 
    catch(Exception e) {
        e.printStackTrace();
        return null;
    }
}

Utilisez les classes d’utilitaires de la bibliothèque Apache Commons Codec: http://commons.apache.org/codec/

String password = org.apache.commons.codec.digest.DigestUtils.md5Hex("password");
System.out.println(password);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top