2009-07-06 25 views
5

Tôi đã tìm kiếm một cách để băm một chuỗi đã cho trong C# sử dụng khóa được xác định trước.MD5 Hashing Đưa ra một khóa trong C#

Trên cuộc phiêu lưu của tôi qua internet cố gắng tìm một ví dụ tôi đã thấy rất nhiều ví dụ MD5CryptoServiceProvider dường như sử dụng một khóa mặc định cho máy, nhưng không ai trong số họ áp dụng một khóa cụ thể. Tôi cần phải có một khóa cụ thể để mã hóa dữ liệu như để đồng bộ hóa nó với máy chủ của người khác. Tôi đưa cho họ một chuỗi băm và một số ID và họ sử dụng phân tích dữ liệu đó và trả lại một bộ tương tự cho tôi. Vì vậy, có anyway để có được md5 để băm thông qua một khóa cụ thể mà sẽ phù hợp với cả hai.

Tôi muốn điều này được thực hiện trong C#, nhưng nếu không thể với các thư viện, bạn có thể làm như vậy với một số ngôn ngữ web như php hoặc asp không?

Chỉnh sửa: Hiểu sai kịch bản tôi bị ném vào và sau khi ngồi một chút và suy nghĩ về lý do tại sao họ sẽ cho tôi sử dụng khóa xuất hiện họ muốn khóa được nối vào cuối chuỗi và băm. Bằng cách đó, máy chủ có thể nối thêm khóa mà nó có cùng với dữ liệu được truyền để đảm bảo máy tính truy cập hợp lệ của nó. Dù sao ... cảm ơn tất cả^_^

Edit2: Như bình luận của tôi dưới đây nói, đó là thuật ngữ 'salting' mà tôi không biết. Oh những niềm vui của việc ném vào một cái gì đó mới mà không có hướng dẫn.

+1

Không có chìa khóa cho MD5 ... như Tom Ritter chỉ ra, đó là ** không ** một thuật toán mã hóa –

+0

Như mọi người đã chỉ ra MD5 được băm, không mã hóa, nhưng nó không phải là rõ ràng từ bài viết của bạn nếu bạn thực sự * làm * muốn băm và bỏ lỡ hoặc thực sự muốn mã hóa. Làm rõ. – annakata

+0

Chỉnh sửa của bạn không thực sự làm rõ câu hỏi của bạn. MD5 không sử dụng "khóa được xác định trước" mà bạn đang hỏi. Tuy nhiên, nếu tất cả những gì bạn cần làm là so sánh băm thì chỉ cần lấy băm của hai đầu vào của bạn và so sánh kết quả bit-cho-bit. Lưu ý rằng MD5 sẽ thường (chặn trường hợp rất khó xảy ra xung đột băm) cho kết quả hoàn toàn khác nhau ngay cả khi đầu vào thay đổi theo số lượng nhỏ nhất. – Naaff

Trả lời

17

MD5 không mã hóa - đó là mã băm. Nó không cho phép một chuỗi được giải mã.

Bạn đang tìm kiếm một thuật toán mã hóa đối xứng. Nó sử dụng cùng một khóa để mã hóa và giải mã. Đang cố sử dụng các chức năng mã hóa without understanding them is dangerous. Ngay cả khi bạn nghĩ rằng bạn hiểu họ, bạn có thể phạm sai lầm.

Nếu bạn đang truyền dữ liệu đến máy chủ của người khác, bạn có thể được tốt hơn bằng cách sử dụng một cái gì đó giống như gpg để mã hóa các tập tin sử dụng một chìa khóa đối xứng bạn đều đồng ý trên qua điện thoại, hoặc có lẽ một số crypto khóa công khai. Bằng cách này, bạn không viết bất kỳ mã mật mã nào, và nó an toàn hơn (không hoàn toàn an toàn, nhớ bạn, nhưng an toàn hơn).


Edit: tôi vẫn đang cố gắng để giải mã yêu cầu của bạn.

MD5 là hàm băm không được mã hóa - không có khóa nào được sử dụng cả. Vì vậy, giả sử máy chủ gửi cho bạn một chuỗi khổng lồ hoặc một tệp và một mã băm của nó. Sau đó bạn sẽ MD5 chuỗi hoặc tập tin, và so sánh băm bạn tính với băm họ đã gửi. Nếu chúng khớp nhau - dữ liệu là không bị hỏng trong quá trình vận chuyển. Điều đó không có nghĩa là không ai giả mạo với những gì họ đã gửi cho bạn quá cảnh, bởi vì MD5 không có "bí mật" với nó. Tôi có thể md5 bất cứ điều gì tôi muốn và gửi cho bạn.

HMAC là hàm băm có khóa . Nó có một thành phần bí mật mà chỉ có bạn và nhóm bạn đang giao tiếp phải biết - chìa khóa bí mật. Nếu họ gửi cho bạn một chuỗi dài hoặc tệp và HMAC, bạn có thể tự tính HMAC, so sánh HMAC của bạn và của họ, và nếu chúng khớp, dữ liệu không bị hỏng trong quá cảnh, cũng như dữ liệu bị giả mạo với.

+0

+1 để đề cập đến HMAC. – ojrac

2

MD5 là hàm băm và, nói đúng, không được sử dụng để "mã hóa" chuỗi. Nó tạo ra một thông điệp "Message Digest 128 bit" (do đó MD trong tên) được sử dụng như một loại dấu vân tay cho chuỗi đầu vào.

0

Bạn có thể sử dụng AES từ C# để làm các loại mã hóa bạn đang tìm kiếm. Đây là an article về cách thực hiện.

0

Bạn nên sử dụng một trong các lớp kế thừa từ SymmetricAlgorithm, ví dụ:

  • AesCryptoServiceProvider
  • DESCryptoServiceProvider
  • RC2CryptoServiceProvider
  • TripleDESCryptoServiceProvider
0

Vì vậy, tại sao không kiểm tra sau thất bại nếu cả hai chuỗi đầu vào giống hệt nhau?

[TestMethod] 
    public void MD5HashTest() 
    { 
     var hash1 = (new MD5CryptoServiceProvider()).ComputeHash(new System.Text.ASCIIEncoding().GetBytes("now is the time for all good men.")); 
     var hash2 = (new MD5CryptoServiceProvider()).ComputeHash(new System.Text.ASCIIEncoding().GetBytes("now is the time for all good men.")); 

     Assert.AreEqual(hash1, hash2); 
    } 
+0

Điều này là do Assert.AreEqual đang kiểm tra bình đẳng tham chiếu: hash1 và hash2 là các đối tượng khác nhau, do đó kiểm tra của bạn không thành công. Tuy nhiên, nếu bạn nhìn vào nội dung của hash1 và hash2, bạn sẽ thấy rằng chúng chứa cùng một tập hợp các byte. –

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