2010-01-23 36 views

Trả lời

2

Check-out FormsAuthentication.HashPasswordForStoringInConfigFile

string hashMD5 = FormsAuthentication.HashPasswordForStoringInConfigFile(Pass + Salt, "MD5"); 

string hashSHA1 = FormsAuthentication.HashPasswordForStoringInConfigFile(Pass + Salt, "SHA1"); 
+0

API này hiện đã lỗi thời. –

2

Tôi không nghĩ rằng có một chức năng duy nhất nhưng bạn có thể làm điều đó trong một vài dòng (ở đây sử dụng SHA512, nhưng có những lựa chọn khác):

using (var sha = new SHA512CryptoServiceProvider()) 
{ 
    byte[] hashed = sha.ComputeHash(Encoding.Default.GetBytes(saltedPassword)); 
    string output = Convert.ToBase64String(hashed); 
} 

Hãy chắc chắn rằng bạn sử dụng một trong những Crypto. .. các lớp học để đảm bảo thuật toán an toàn hơn được sử dụng.

+4

Gói rất xấu. Một băm không có muối chịu sự tấn công của bảng cầu vồng. Việc bạn sử dụng các lớp mã hóa là tốt nhưng bạn phải bao gồm một muối để làm cho câu trả lời này hữu ích. Ngoài ra, dòng cuối cùng nên sử dụng 'Convert.ToBase64String', nhanh hơn' BitConverter.ToString' và tạo chuỗi ngắn hơn nhiều (88 byte so với 192 byte trong trường hợp này). Nếu hai vấn đề này được sửa chữa thì điều này có thể trở thành câu trả lời hay nhất, IMHO. –

+0

Cảm ơn bạn đã làm rõ. Có, rõ ràng là mật khẩu nên được muối trước khi băm mà tôi đã có ý định ở đây nhưng tôi thấy nơi mà sự nhầm lẫn đến từ. Tôi sẽ cập nhật để rõ ràng hơn. Cảm ơn bạn đã đề cập đến việc chuyển đổi Base64String quá. –

+0

Vui lòng không sử dụng một lần vượt qua bất kỳ hàm băm nào, bất kể nó hoạt động tốt đến mức nào. Sử dụng một phương pháp được biết là giỏi băm mật khẩu - SCrypt, BCrypt hoặc PBKDF2 (như RFC2898DeriveBytes của .NET). Trong khi SHA-512 là một hàm băm mật mã tốt, ngay cả ở một bất lợi nghiêm trọng do hoạt động 64 bit kém trên GPU cổ điển 2014, [oclHashcat] (http://hashcat.net/oclhashcat/) trên một máy tính với 8x Đồng hồ lõi AMD R9 290Xstock vẫn có thể thử 797 triệu lần đoán mỗi giây, hoặc 2E15 đoán mỗi tháng. –

1

Không bạn không nên sử dụng MD5 cho băm mật khẩu !!!!!

Xấu !!!!! Bạn cũng không nên thực hiện mật khẩu + muối trên một thẻ Hash pass (md5 hoặc khác) !!! Xấu!!!!

Cũng không phải bạn nên làm muối + mật khẩu băm nhiều lần (unles XOR mỗi băm qua theo PBKDF2 !!! Xấu !!!!

Sử dụng API này: https://sourceforge.net/projects/pwdtknet Tốt !!!!!

1

Có, .NET Framework 2.0 trở lên (đến và bao gồm 4.5 lúc này) triển khai PBKDF2 (còn được gọi là RFC2898 và PKCS # 5v2) trong một lớp có tên là Rfc2898DeriveBytes. Về mặt kỹ thuật, nó triển khai PBKDF2-HMAC-SHA-1, trong khi không tốt như PBKDF2-HMAC-SHA-512, vẫn hợp lý để băm mật khẩu.

Đối số PBKDF2:

  • HMAC không phải là đối số cho lớp này - HMAC-SHA-1 được khắc phục trong quá trình triển khai này, vì vậy bạn không phải lo lắng về điều đó.
  • Mật khẩu là mật khẩu của người dùng.
    • bản rõ, tất nhiên, bị loại bỏ sau khi băm.
  • Muối là một chuỗi ngẫu nhiên mã hóa trên mỗi hàng có độ dài đủ (ví dụ: ít nhất 8 byte). Mỗi mật khẩu cần muối ngẫu nhiên riêng của mình vì vậy nếu 300 người dùng chọn "P @ $$ w0rd" làm mật khẩu của họ, kết quả băm sẽ khác nhau.
    • muối được lưu trữ ở dạng bản rõ trong cơ sở dữ liệu; bạn cần nó vào lần sau khi bạn tạo hash mật khẩu để xem kết quả có giống nhau hay không.
  • Lặp lại là số lần bạn sẽ lặp lại. Đối với bất kỳ phần cứng máy tính để bàn hoặc máy chủ nào, hãy bắt đầu trong hàng chục nghìn và đi lên cho đến khi nó bị đau.
    • số lần lặp cũng phải được lưu trữ trong văn bản thuần túy trong cơ sở dữ liệu, do đó sẽ không đáng kể để thay đổi số này sau đó (tức là làm cho nó cao hơn khi tăng công suất xử lý).
  • .GetBytes là độ dài đầu ra, bạn đoán nó, byte. Trong trường hợp này, bạn nên sử dụng 20.
    • Lý do (thảo luận nâng cao): để băm mật khẩu, không bao giờ lớn hơn kích thước băm gốc, vì kẻ tấn công sẽ không cần tạo nhiều hơn (và tạo kích thước băm gốc + 1 byte mất gấp đôi thời gian, vì nó bắt đầu một tập hợp các lần lặp mới cho mỗi kích thước băm gốc trong độ dài đầu ra, nối các kết quả lại với nhau - kẻ tấn công có thể giả định một cách an toàn rằng nếu kết quả đầu tiên khớp, nó sẽ khớp với nhau và chắc chắn 100% rằng nếu khối đầu tiên không thành công, nó không khớp). Vì lớp này được giới hạn trong SHA-1, kích thước băm gốc là 20 byte. Nếu bạn sử dụng thư viện khác có tùy chọn, SHA-256 là 32 byte, SHA-512 là 64 byte.

Lưu ý rằng HMACSHA512 versus Rfc2898DeriveBytes for password hash chứa một số mã NET mẫu mà tôi đã không được phân tích một cách chi tiết, nhưng có thể là một điểm khởi đầu hữu ích.

+0

Mọi nhận xét về cách tốt hơn/tệ hơn 'FormsAuthentication.HashPasswordForStoringInConfigFile'? –

+1

RFC2898 là tốt hơn nhiều, ngay cả với một số lặp lại moronic 1 - và hàng chục ngàn lần tốt hơn với một số lặp hợp lý trong hàng chục ngàn! Chúng bắt đầu với chính Microsoft [Lưu ý: API này hiện đã lỗi thời.] (Http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.hashpasswordforstoringinconfigfile (v = vs.110) .aspx) và tiếp tục thông qua "Nó chỉ là (gần như chắc chắn) MD5 hoặc SHA-1 không kiềm chế! Đừng làm thế !!!" dựa trên [Thả thay thế cho FormsAuthentication.HashPasswordForStoringInConfigFile?] (https://stackoverflow.com/q/13527277/1967612) –

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