سؤال

الوظيفة التالية في 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
هل كانت مفيدة؟

المحلول

وحاول الترميز في قاعدة 16. فقط للحصول على انك بدأته ... 94 في قاعدة 16 غير 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();
}

نصائح أخرى

واستبدال

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

ويمكن اختصارها ذلك إلى أونيلينير باستخدام المرافق طبقات من المكتبة اباتشي العموم ترميز ( HTTP: / /commons.apache.org/codec )

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

وهذان متساوون. واحد جافا يبدو أن في العشرية. تحويله إلى ست عشرية.

والنظر في تحويل بايت العشرية إلى ست عشرية. على سبيل المثال 94 قاعدة 10 هو قاعدة 5E 16.

وذلك لأن قاعدة مختلفة. نتيجة الخلية MD5 هي في الأساس 16، في حين أن MD5 جافا في قاعدة-10.

وأتمنى أن تساعدك على زيادة، ولكن ينتن الرياضيات بلدي. ساعد صديق لي توليد الاختباري قاعدة 10 من الاختباري قاعدة 16 في PHP، ولكني فقدت البرنامج النصي. نأمل أن تتمكن من العثور على إجابة على أساس ذلك.

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

وانظروا كيف أفعل ذلك، رمز النفس تفسيرها!

وجافا البرمجية:

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

والاستعلام الخلية التي تنتج نفس التجزئة:

SELECT md5( 'cleartext' ); 

وإخراج:

وMD5 ( 'نص واضح')
5ab677ec767735cebd67407005786016

وبدلا من إعادة اختراع العجلة، في محاولة أباتشي المشاعات الترميز ( http://commons.apache.org/codec / ) التي سوف تتعامل مع الترميز عرافة لك مع Hex.encodeHex (بايت [])

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

استخدم فئات الأداة المساعدة من مكتبة Apache Commons Codec: http://commons.Apache.org/codec/

String password = org.apache.commons.codec.digest.DigestUtils.md5Hex("password");
System.out.println(password);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top