Frage

Die nächste Funktion in MySQL

MD5( 'secret' ) erzeugt 5ebe2294ecd0e0f08eab7690d2a6ee69

Ich möchte eine Java-Funktion haben, um die gleiche Leistung zu erzeugen. Aber

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

erzeugt

94-190-34-148-236-208-224-240-142-171-118-144-210-166-238-105
War es hilfreich?

Lösung

Versuchen Sie Codierung in Basis 16 nur für den Anfang ... 94 in der Basis 16 ist 5E.

** Edit: ** Versuchen Sie getString Methode zu ändern:

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

Andere Tipps

ersetzen

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

durch

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

Dies kann mit Hilfe der Utility-Klassen aus der Apache Commons Codec-Bibliothek auf einen Einzeiler verkürzt werden ( http: / /commons.apache.org/codec )

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

Die beiden sind gleich. Die Java eine erscheint in dezimal zu sein. Wandelt es in hexadezimal.

Betrachten Sie Ihr dezimales Bytes hexadezimal konvertieren. Zum Beispiel 94 der Basis 10 ist 5e Basis 16.

Das ist, weil die Basis unterscheidet. Das MySQL MD5 Ergebnis ist in der Basis 16, während der Java-MD5 in der Basis-10 ist.

Ich wünschte, ich könnte Ihnen weiter helfen, aber meine Mathe stinkt. Ein Freund von mir hat mir geholfen, ein Basis-10-Prüfsumme von einer Basis-16-Prüfsumme in PHP zu generieren, aber ich habe das Skript verloren. Hoffe, Sie können Ihre Antwort auf dieser Grundlage finden.

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

Sehen Sie, wie ich es tun, ist der Code selbst erklärbar!

Java-Code:

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

Ausgabe:

MD5: Klartext: 5ab677ec767735cebd67407005786016

Mysql-Abfrage, die den gleichen Hash erzeugt:

SELECT md5( 'cleartext' ); 

Ausgabe:

md5 ( 'Klartext')
5ab677ec767735cebd67407005786016

Anstatt das Rad neu zu erfinden, versuchen Apache commons Codec ( http://commons.apache.org/codec / ), die die hex-Codierung für Sie mit Hex.encodeHex (byte [])

wird Griff
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;
    }
}

, um die Utility-Klassen aus der Apache Commons Codec-Bibliothek verwenden: http://commons.apache.org/codec/

String password = org.apache.commons.codec.digest.DigestUtils.md5Hex("password");
System.out.println(password);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top