2010-09-20 45 views
13

Tôi biết rằng có rất nhiều chủ đề tương tự, nhưng vẫn ... ai đó có thể cung cấp cho tôi ví dụ làm việc về phương pháp tạo chuỗi MD5.
Tôi hiện đang sử dụng MessageDigest, và tôi đang làm những điều sau đây để có được một chuỗiChuyển đổi mảng MD5 thành chuỗi java

sun.misc.BASE64Encoder().encode(messageDigest.digest()) 

Tôi đoán có một số cách tốt hơn để làm điều đó.
Cảm ơn bạn trước!

+0

Những lớp BASE64Encoder là điều này? –

+0

Bạn phải yêu Google! :-) –

+0

Xin lỗi .... ở đây là nhập sun.misc.BASE64Encoder; – Andrew

Trả lời

10
MessageDigest md = MessageDigest.getInstance("MD5"); 
byte[] arr = md.digest(bytesOfMessage); 
return Base64.getEncoder().encodeToString(arr); 

lưu ý: md5 không được coi là thuật toán băm tốt nữa, hãy xem xét lựa chọn Shas

+15

FYI: MD5 là một thuật toán băm, không phải là một thuật toán mã hóa. Do đó, nó không * mã hóa * dữ liệu. Thay vào đó, nó * băm * dữ liệu. –

+0

Cảm ơn! Làm việc tốt cho tôi – Andrew

+0

@Adam Paynter Cảm ơn, tôi đã chỉnh sửa chú thích –

16

Tôi muốn sử dụng commons-codec

  • Base64 - Base64.encodeBase64(digestBytes)
  • Hex-string - Hex.encodeHex(digestBytes)
+4

org.apache.commons.codec.digest.DigestUtils –

+1

DigestUtils là giải pháp tốt nhất trên trang này. :) –

+0

Mặc dù thật tuyệt vời khi sử dụng mã thư viện thay vì viết thuật toán của riêng bạn, nó đi kèm với bất lợi là toàn bộ thư viện phải được bao gồm trong bản phân phối là một sự xấu hổ vì lợi ích của một phương pháp. Rõ ràng, nếu nhiều lớp và phương pháp khác đang được sử dụng quá thì điều này là lý tưởng nhưng điều này có lẽ sẽ không thường xảy ra. – darrenp

4
// Convert to hex string 
StringBuffer sb = new StringBuffer(); 
for (int i = 0; i < messageDigest.length; i++) { 
    if ((0xff & messageDigest[i]) < 0x10) { 
     sb.append('0'); 
    } 
    sb.append(Integer.toHexString(0xff & messageDigest[i])); 
} 
String md5 = sb.toString(); 

Điều này giả định bạn thực sự muốn MD5 của bạn được in dưới dạng chuỗi thập lục phân, chứ không phải mã hóa BASE64. Đó là cách nó thường được đại diện.

+0

Chỉ là một lời cảnh báo nếu mọi người sử dụng giải pháp này. Nó không cho phép các số 0 đứng đầu có thể làm mất kiểm tra băm. Vì vậy, 0x0E sẽ chỉ được in dưới dạng E và 0x00 sẽ bị tước xuống một đơn 0. Công việc cơ bản xung quanh là kiểm tra độ dài của mỗi kết quả và thêm một số không khi chiều dài là 1. –

+0

@MechIntel Bạn hoàn toàn đúng. Tôi vừa cập nhật câu trả lời. Cảm ơn bạn cho người đứng đầu lên! – Grodriguez

1

Tôi đã nhìn thấy giải pháp tiếp theo:

byte[] digest = md.digest(someDataByteArray); 
    StringBuilder hex = new StringBuilder(); 
    for (byte b : digest) { 
     hex.append(String.format("%02x", b)); 
    } 
+0

Phương pháp này sẽ nhận được kết quả tương tự như những gì bạn nhận được bằng cách sử dụng chương trình 'md5' trong thiết bị đầu cuối * nix, và đủ rõ ràng! – Marvin

Các vấn đề liên quan