2010-01-05 32 views
17

kẻ Hải,
Làm thế nào để muối và băm một giá trị mật khẩu bằng cách sử dụng C#?

tôi đến để biết rằng lưu trữ giá trị hash của mật khẩu là một trong những an toàn từ Preferred Method of Storing Passwords In Database ...

  • Làm thế nào để muối và băm một giá trị mật khẩu sử dụng C#?

  • Cách so sánh cả hai giá trị được lưu trữ trong DB và giá trị được người dùng đưa ra?

+1

đây là một lib cho việc này: http://encrypto.codeplex.com/ – Omu

Trả lời

20

Cách phổ biến nhất để làm điều này là sử dụng một thuật toán băm. Có một số tuyệt đối blog post here về cách sử dụng thuật toán MD5 để băm chuỗi, nhưng có nhiều ví dụ khác trong không gian tên System.Cryptography.

Đối với # 2, hướng dẫn chung bước-by-step cách này sẽ làm việc sẽ là như sau:

On đăng ký:

  1. Hash mật khẩu của người dùng sử dụng thuật toán định của bạn và lưu nó trong cơ sở dữ liệu
  2. Salt băm này (không bắt buộc, nhưng ưa thích)

On đăng nhập/user & mật khẩu kiểm tra:

  1. Tra cứu trong cơ sở dữ liệu cho tên người dùng
  2. Nếu nó tồn tại, lấy lại mật khẩu băm
  3. Hash và muối mật khẩu đã nhập và so sánh nó với lấy mật khẩu

Đó là tất cả tương đối dài, nhưng nó rất an toàn.

Có hướng dẫn cực kỳ chuyên sâu khác về việc băm salting here.

+0

Thông tin thêm: Có một vài chi tiết phiên bản của tên đăng nhập và đăng ký quá trình được nêu trong câu hỏi SO sau: http://stackoverflow.com/questions/1471654/reversing-an-md5-hash/1471668#1471668 –

+0

Muối là một đầu vào bổ sung cho quá trình băm thông thường, nhưng nếu không một lời giải thích rõ ràng, tốt . +1 –

+0

hãy giúp tôi trong câu hỏi này http://stackoverflow.com/questions/2863034/sql-serverwhat-data-type-to-use-for-password-salt-and-hash-values-and-what- leng –

0

Vì băm bạn có một số thuật toán được hỗ trợ trong System.Security.Cryptography, cho usecase bạn có thể muốn chọn hàm băm dựa trên SHA hoặc một cái gì đó tương tự.

Về so sánh: Bạn không so sánh giá trị DB và giá trị mà người dùng đã cung cấp cho bạn. Bạn sử dụng cùng một chức năng mã hóa/băm mà bạn đã sử dụng để lưu trữ mật khẩu trong DB ở địa điểm đầu tiên, lần này với đầu vào của người dùng. Nếu kết quả bằng băm trong DB thì mật khẩu là (có thể) đúng.

Mục đích là không ai có quyền truy cập vào DB có thể truy xuất mật khẩu bằng văn bản rõ ràng và thậm chí không cần chương trình của bạn biết (chỉ phần chấp nhận đầu vào của người dùng sẽ có trong một thời gian ngắn) .

Liên kết (thậm chí có bản sao):

0

Nói đúng ra, bạn nên salt the password sau đó băm nó, để tránh một cuộc tấn công từ điển. Bạn có thể sử dụng bất kỳ triển khai nào của lớp trừu tượng HashAlgorithm trong không gian tên System.Cryptography để tính toán lựa chọn tốt nhất băm - hiện tại có thể là một trong số SHA-2 algorithms.

Bạn lưu trữ băm không phải là mật khẩu và so sánh giá trị băm để xác thực người dùng.

+0

@ David bất kỳ ví dụ –

0

Như những người khác đã nói, có nhiều tùy chọn.

Dưới đây là một số mẫu mã (sử dụng MD5 thay vì SHA) từ Microsoft có thể giúp được bạn bắt đầu

using System; 
    using System.Security.Cryptography; 
    using System.Text; 

    string sSourceData; 
    byte[] tmpSource; 
    byte[] tmpHash; 

    sSourceData = "MySourceData"; 
    //Create a byte array from source data. 
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData); 

    //Compute hash based on source data. 
    tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource); 
5

băm đơn giản:

public string GetSHA256Hash(string s) 
     { 
      if (string.IsNullOrEmpty(s)) 
      { 
       throw new ArgumentException("An empty string value cannot be hashed."); 
      } 

      Byte[] data = System.Text.Encoding.UTF8.GetBytes(s); 
      Byte[] hash = new SHA256CryptoServiceProvider().ComputeHash(data); 
      return Convert.ToBase64String(hash); 
     } 
Các vấn đề liên quan