10

MySQLの次の関数

MD5( 'secret' )5ebe2294ecd0e0f08eab7690d2a6ee69を生成します

同じ出力を生成するJava関数が欲しいのですが。だが

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

生成します

94-190-34-148-236-208-224-240-142-171-118-144-210-166-238-105
4

10 に答える 10

25

ベース16でエンコードしてみてください。開始するには...ベース16の94は5Eです。

**編集:** 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();
}
于 2009-06-23T17:21:31.743 に答える
6

交換

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

String hex = Integer.toHexString((int) 0x00FF & b);
if (hex.length == 1) sb.append("0");
sb.append( hex );
于 2009-06-23T17:26:56.290 に答える
4

これは、Apache Commonsコーデックライブラリ( http://commons.apache.org/codec)のユーティリティクラスを使用して、ワンライナーに短縮できます。

String md = org.apache.commons.codec.digest.DigestUtils.md5hex("whatever");
于 2010-11-29T20:04:55.817 に答える
3

これらの2つは等しいです。Javaのものは10進数のようです。16進数に変換します。

于 2009-06-23T17:22:43.630 に答える
3

それはベースが違うからです。MySQL MD5の結果は基数16ですが、JavaMD5は基数10です。

私はあなたをさらに助けることができればいいのですが、私の数学は悪臭を放ちます。私の友人は、PHPの基数16のチェックサムから基数10のチェックサムを生成するのを手伝ってくれましたが、スクリプトを失いました。あなたがこれに基づいてあなたの答えを見つけることができることを願っています。

于 2009-06-23T17:23:18.293 に答える
2

10進数のバイトを16進数に変換することを検討してください。たとえば、94基数10は5e基数16です。

于 2009-06-23T17:22:19.293 に答える
2
String password = org.springframework.util.DigestUtils.md5DigestAsHex("password".getBytes())
System.out.println(password)
于 2011-03-09T10:37:06.957 に答える
1

車輪の再発明ではなく、Hex.encodeHex(byte [])を使用して16進エンコーディングを処理するApache commons codec( http://commons.apache.org/codec/ )を試してください。

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;
    }
}
于 2009-10-09T19:34:34.737 に答える
0

Apache Commons Codecライブラリのユーティリティクラスを使用します:http://commons.apache.org/codec/

String password = org.apache.commons.codec.digest.DigestUtils.md5Hex("password");
System.out.println(password);
于 2011-01-03T18:40:55.587 に答える
0

私がそれをどのように行うか見てください、コードは自明です!

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

出力:

MD5:クリアテキスト:5ab677ec767735cebd67407005786016

同じハッシュを生成するMysqlクエリ:

SELECT md5( 'cleartext' ); 

出力:

md5('cleartext')
5ab677ec767735cebd67407005786016

于 2016-03-25T19:28:45.477 に答える