2009-06-23 44 views
9

Chức năng tiếp theo trong MySQLMySQL MD5 và Java MD5 không bằng

MD5( 'secret') tạo 5ebe2294ecd0e0f08eab7690d2a6ee69

Tôi muốn có một hàm Java để tạo ra sản lượng tương tự. Nhưng

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

tạo mã hóa

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

Trả lời

24

Hãy thử ở cơ sở 16. Chỉ cần để giúp bạn bắt đầu ... 94 ở cơ sở 16 là 5E.

** Edit: ** Hãy thử thay đổi phương pháp getString của bạn:

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

@Randolpho: nếu b <0x10, bạn cần phải pad với 0 – laalto

+0

điểm xuất sắc; chỉnh sửa để bao gồm kiểm tra @ mihi (IMO tốt hơn so với kiểm tra giá trị byte). – Randolpho

+0

bạn quên() trong hex.length() –

2

xem xét chuyển đổi byte thập phân của bạn để hệ thập lục phân. Ví dụ: 94 cơ sở 10 là cơ sở 5e 16.

3

Hai giá trị này bằng nhau. Chữ Java xuất hiện theo dạng thập phân. Chuyển đổi nó sang thập lục phân.

2

Đó là vì cơ sở khác. Kết quả MD5 của MySQL nằm trong cơ sở-16, trong khi MD5 Java nằm trong cơ sở-10.

Tôi ước tôi có thể giúp bạn nhiều hơn, nhưng toán học của tôi bị ngừng lại. Một người bạn của tôi đã giúp tôi tạo ra một kiểm tra cơ bản-10 từ một kiểm tra cơ bản-16 trong PHP, nhưng tôi đã mất tập lệnh. Hy vọng bạn có thể tìm thấy câu trả lời của bạn dựa trên điều này.

6

thay

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

bởi

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

Tôi sẽ cung cấp cho bạn nhiều hơn +1 nếu có thể. :) – Randolpho

0

Thay vì reinventing the wheel, hãy thử Apache commons codec (http://commons.apache.org/codec/) mà sẽ xử lý mã hóa hex cho bạn với Hex.encodeHex (byte [])

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

Điều này có thể được rút ngắn thành một lớp bằng cách sử dụng tiện ích classe s từ thư viện Apache Commons Codec (http://commons.apache.org/codec)

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

Sử dụng các lớp tiện ích từ thư viện Apache Commons Codec: http://commons.apache.org/codec/

String password = org.apache.commons.codec.digest.DigestUtils.md5Hex("password"); 
System.out.println(password); 
1
String password = org.springframework.util.DigestUtils.md5DigestAsHex("password".getBytes()) 
System.out.println(password) 
0

Look làm thế nào tôi làm điều đó, mã này là tự giải thích được !đang

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

Output:

MD5: cleartext: 5ab677ec767735cebd67407005786016

Mysql truy vấn mà tạo ra băm giống nhau:

SELECT md5('cleartext'); 

Output:

md5 ('cleartext')
5ab677ec767735cebd67407005786016