2008-10-10 33 views
5

Tôi đang cố gắng tạo các băm MD5 tương đương trong cả JavaScript và .Net. Không thực hiện được, tôi quyết định sử dụng tính toán của bên thứ ba - web site cho từ "mật khẩu". Sau này tôi sẽ thêm muối vào, nhưng hiện tại, tôi không thể lấy phiên bản .net để khớp với mã băm của trang web:Tại sao mã băm MD5 tính phí của tôi không tương đương với băm được tính toán trên một trang web?

5f4dcc3b5aa765d61d8327deb882cf99 

Tôi đoán đó là vấn đề mã hóa, nhưng tôi ' ve đã thử khoảng 8 biến thể khác nhau của phương pháp để tính toán một băm MD5 trong. Net, và không ai trong số họ phù hợp với những gì tôi đã thu được trong JavaScript (hoặc từ trang web). MSDN example Đây là một trong những phương pháp tôi đã cố gắng, mà kết quả trong băm này mà tôi đã thường nhận:

7c6a180b36896a0a8c02787eeafb0e4c 

Edit: Đáng buồn thay, tôi đã vô tình được cung cấp dây nguồn khác nhau để hai hiện thực khác nhau. EBSAK. : -/Vẫn muốn nghe câu trả lời của bạn để theo dõi.

Câu hỏi bổ sung: định dạng/mã hóa nào là tốt nhất để lưu trữ giá trị băm trong cơ sở dữ liệu?

+0

bạn đang sử dụng gì băm javascript cho? Lý do tại sao tôi hỏi là nếu nó cho an ninh, nó chỉ nên được tạo ra trên máy chủ. –

+0

Để bước trở lại từ cuộc thảo luận này một chút, tôi cảm thấy rằng [bài đăng của Thomas Ptacek] (http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you -need-to-know-about-secure-password-schemes.html) (để trả lời [bài đăng Jeff Atwood] (http://blog.codinghorror.com/rainbow-hash-cracking/) về một chủ đề tương tự) giải thích lý do tại sao bạn không nên sử dụng bất cứ thứ gì như MD5 để băm mật khẩu. Đề nghị đọc. –

Trả lời

9

Chạy mã từ trang web MSDN bạn trích dẫn:

// Hash an input string and return the hash as 
    // a 32 character hexadecimal string. 
    static string getMd5Hash(string input) 
    { 
      // Create a new instance of the MD5CryptoServiceProvider object. 
      MD5 md5Hasher = MD5.Create(); 

      // Convert the input string to a byte array and compute the hash. 
      byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input)); 

      // Create a new Stringbuilder to collect the bytes 
      // and create a string. 
      StringBuilder sBuilder = new StringBuilder(); 

      // Loop through each byte of the hashed data 
      // and format each one as a hexadecimal string. 
      for (int i = 0; i < data.Length; i++) 
      { 
       sBuilder.Append(data[i].ToString("x2")); 
      } 

      // Return the hexadecimal string. 
      return sBuilder.ToString(); 
     } 


     static void Main(string[] args) 
     { 
      System.Console.WriteLine(getMd5Hash("password")); 
     } 

lợi nhuận:

5f4dcc3b5aa765d61d8327deb882cf99 
+0

Đúng. : -/Tôi đã sử dụng các chuỗi nguồn khác nhau trong hai lần triển khai. Kẻ ngốc! – pc1oad1etter

0

tôi nhận được giá trị tương tự như trang web cho từ "password":

$ echo -n password | md5 
5f4dcc3b5aa765d61d8327deb882cf99 

Nếu không nhìn thấy mã bạn đang thực sự sử dụng, thật khó để nói những gì có thể xảy ra sai.

Để lưu trữ băm trong cơ sở dữ liệu, tôi lưu trữ chúng dưới dạng chuỗi thập lục phân. Mặc dù hầu hết các cơ sở dữ liệu có thể xử lý các đốm màu nhị phân, lưu trữ chúng dưới dạng nhị phân chỉ tiết kiệm được một nửa không gian và chúng khó truy vấn và thao tác hơn. Có thể là khác dữ liệu bạn đang lưu trữ cùng với băm lớn hơn.

+0

Hoặc sử dụng Base64, chỉ mở rộng nhị phân một phần ba thay vì tăng gấp đôi. Không phải MD5 là an toàn để sử dụng cho băm mật khẩu. –

0

phiên bản VB.Net này cho kết quả tương tự như MySQL từ kinh nghiệm của riêng tôi:

Private Function MD5Hash(ByVal str As String) As String 

    Dim md5 As MD5 = MD5CryptoServiceProvider.Create 
    Dim hashed As Byte() = md5.ComputeHash(Encoding.Default.GetBytes(str)) 
    Dim sb As New StringBuilder 

    For i As Integer = 0 To hashed.Length - 1 
     sb.AppendFormat("{0:x2}", hashed(i)) 
    Next 

    Return sb.ToString 

End Function 
0

Bạn có bất kỳ mã nào bạn đang cố gắng để làm điều này?

(trả lời câu hỏi thứ hai) Tôi thường sử dụng trường chuỗi và lưu nó dưới dạng mã hóa BASE64. Đủ dễ dàng để làm việc và so sánh.

/// <summary> 
/// Gets the Base 64 encoded SHA1 hashed password 
/// </summary> 
/// <returns>A Base 64 encoded string representing the SHA1 Hash of the password</returns> 
public string ToBase64SHA1String() 
{ 
    return Convert.ToBase64String(this.GetSHA1HashCode()); 

} 
+0

Tôi đã liên kết với một trong những phương pháp tôi đang sử dụng - trong bài đăng. – pc1oad1etter

0

Nó cũng cần lưu ý rằng khoản tiền MD5 có thể bị bẻ khóa với các bảng cầu vồng (có các chương trình miễn phí trên internet sẽ chấp nhận số tiền MD5 làm đầu vào và sẽ xuất ra một bản rõ - thường là mật khẩu)

SHA1 có lẽ là lựa chọn tốt hơn ...

EDIT: thêm muối là một cách tốt để tránh bị băm của bạn không bị đảo ngược
EDIT 2: nếu tôi đã làm phiền để đọc bài viết của bạn tôi sẽ nhận thấy bạn đã nói rằng bạn có kế hoạch để thêm muối

+0

Tôi sẽ tranh luận ngay cả với một MD5 muối không đủ an toàn. –

+0

@Ramhound well now 5 năm sau bình luận của bạn chắc chắn không an toàn =) – Gaspa79

3

này đang xảy ra bởi vì bằng cách nào đó bạn đang băm password1 thay vì password, hoặc có lẽ tính password sai và nó bằng cách nào đó một cách bí ẩn bằng password1.

Bạn có thể làm một tra cứu đảo ngược của băm md5 bạn được cung cấp bởi googling

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