2012-10-19 58 views
18

Cần lấy MD5 băm từ chuỗi.
Nhận lỗi MD5 là rỗng.
Tôi đang cố gắng lấy mã băm MD5 32 ký tự từ một chuỗi.MD5 băm từ chuỗi

using (System.Security.Cryptography.MD5 md5 = 
     System.Security.Cryptography.MD5.Create("TextToHash")) 
{ 
    byte[] retVal = md5.Hash; 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < retVal.Length; i++) 
    { 
     sb.Append(retVal[i].ToString("x2")); 
    } 
} 

Trả lời

42

Cần lấy MD5 băm từ chuỗi.

Sau đó, trước tiên, bạn cần chuyển đổi chuỗi của mình thành dữ liệu nhị phân dưới một số hình thức. Làm thế nào bạn làm điều đó sẽ phụ thuộc vào yêu cầu của bạn, nhưng nó có thể là Encoding.GetBytes đối với một số mã hóa ... bạn cần phải làm việc ra mà mã hóa mặc dù. Ví dụ: hash này có cần khớp với hàm băm được tạo ở một nơi khác không?

Nhận lỗi MD5 là rỗng.

Đó là vì bạn đang sử dụng MD5.Create không chính xác. Đối số là một tên thuật toán . Bạn gần như chắc chắn chỉ cần sử dụng parameterless overload thay thế.

tôi nghi ngờ bạn muốn một cái gì đó như:

byte[] hash; 
using (MD5 md5 = MD5.Create()) 
{ 
    hash = md5.ComputeHash(Encoding.UTF8.GetBytes(text)); 
} 
// Now convert the binary hash into text if you must... 
+1

Nếu nó đến từ SQL vachar (tối đa) thì UTF8 có phải là cược tốt nhất không? – Paparazzi

+0

re: quá tải parameterless - là có một nguy cơ mà các thuật toán mặc định sẽ thay đổi từ một phiên bản .Net tiếp theo? Nếu vậy sau đó băm của cùng một chuỗi từ một phiên bản kế tiếp sẽ không khớp? – xanadont

+2

@xanadont: Không. MD5 là một thuật toán chuẩn hóa. Kết quả thay đổi về cơ bản sẽ là một lỗi. –

19

Chuỗi truyền cho Create không phải là "văn bản để băm", nhưng các thuật toán để sử dụng. Tôi nghi ngờ bạn muốn:

using (System.Security.Cryptography.MD5 md5 = 
    System.Security.Cryptography.MD5.Create()) 
{ 
    byte[] retVal = md5.ComputeHash(Encoding.Unicode.GetBytes("TextToHash")); 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < retVal.Length; i++) 
    { 
     sb.Append(retVal[i].ToString("x2")); 
    } 
} 
+1

Hi Reed: Tôi có một câu hỏi: Làm cách nào để biết mã hóa nào sẽ sử dụng? Trong trường hợp của tôi, tôi cần calc một hash mà tôi nhận được như một chuỗi truy vấn. (vì vậy khi nó được đăng http, nó có thể là UTF-8), BAO GIỜ, một khi nó được lưu trữ trong một chuỗi .Net, bây giờ nó sẽ được trong Unicode (UTF-16), bởi vì đó là mã hóa bản địa? Sự biến đổi đó có xảy ra với tôi không? – JMarsch

+0

@JMarsch Yeah - nó có khả năng "chỉ hoạt động" nếu bạn sử dụng Encoding.Unicode, nếu nó là UTF-8 ban đầu. –

+0

Hãy nhớ rằng nếu MD5 "nguồn" của bạn đã được tính toán trên bản trình bày utf-8 của chuỗi, bạn sẽ nhận được MD5 khác nếu bây giờ bạn sử dụng utf-16. Điều này đúng ngay cả khi bạn chỉ có các ký tự ASCII trong chuỗi của bạn. – brighty

1

Lý do bạn đang nhận được một lợi nhuận nullstring tham số cho phương thức Create speciies thuật toán, không phải là văn bản đang được băm. Không có thuật toán TextToHash do đó bạn nhận được null làm lợi nhuận.

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