TL; DR sử dụng Microsoft.AspNetCore.Cryptography.KeyDerivation, triển khai PBKDF2 với SHA-512.
Ý tưởng hay để bắt đầu với băm mật khẩu là xem xét những gì OWASP guidelines nói. Danh sách các thuật toán được đề xuất bao gồm Argon2, PBKDF2, scrypt và bcrypt. Tất cả các thuật toán này có thể được điều chỉnh để điều chỉnh thời gian cần thiết để băm mật khẩu, và tương ứng, thời gian để crack nó thông qua brute-force. Tất cả các thuật toán này sử dụng muối để bảo vệ khỏi các cuộc tấn công của bảng cầu vồng.
Cả của các thuật toán là terribly yếu, nhưng có một số khác biệt:
- bcrypt đã được khoảng gần 20 năm, đã được sử dụng rộng rãi và đã chịu đựng sự thử thách của thời gian. Nó là khá khả năng chống lại các cuộc tấn công GPU , nhưng không phải để FPGA
- Argon2 là bổ sung mới nhất, là người chiến thắng của cuộc thi băm mật khẩu năm 2015. Nó có bảo vệ tốt hơn chống lại các cuộc tấn công GPU và FPGA, nhưng hơi quá gần với ý thích của tôi
- Tôi không biết nhiều về việc giải mã. Nó đã được thiết kế để ngăn chặn các cuộc tấn công tăng tốc GPU và FPGA, nhưng tôi đã nghe nói nó không mạnh như đã tuyên bố ban đầu
- PBKDF2 là họ các thuật toán được tham số bởi hàm băm khác nhau . Nó không cung cấp một sự bảo vệ cụ thể chống lại các cuộc tấn công của GPU hoặc ASIC, đặc biệt nếu một hàm băm yếu hơn như SHA-1 được sử dụng, nhưng nó được chứng nhận FIPS nếu nó quan trọng với bạn, và vẫn chấp nhận được nếu số lần lặp lại là đủ lớn.
Chỉ dựa trên thuật toán, tôi có thể đi với bcrypt, PBKDF2 là ít thuận lợi nhất.
Tuy nhiên, nó không phải là toàn bộ câu chuyện, bởi vì ngay cả các thuật toán tốt nhất có thể được thực hiện không an toàn bởi một thực hiện xấu. Hãy xem những gì có sẵn cho nền tảng .NET:
- Bcrypt có sẵn qua bcrypt.net. Họ nói rằng việc thực hiện dựa trên Java jBCrypt. Hiện tại có 6 người đóng góp và 8 vấn đề (tất cả đã đóng) trên github. Nhìn chung, nó có vẻ tốt, tuy nhiên, tôi không biết nếu có ai đã thực hiện một kiểm toán của mã, và thật khó để nói liệu một phiên bản cập nhật sẽ có sẵn đủ sớm nếu một lỗ hổng được tìm thấy. Tôi đã nghe Stack Overflow chuyển từ sử dụng bcrypt vì những lý do như vậy
- Có lẽ cách tốt nhất để sử dụng Argon2 là thông qua các ràng buộc với thư viện libsodium nổi tiếng , ví dụ: https://github.com/adamcaudill/libsodium-net. Ý tưởng là hầu hết các mật mã được thực hiện thông qua libsodium, trong đó có đáng kể hỗ trợ, và các phần 'chưa được kiểm tra' là khá hạn chế.Tuy nhiên, trong chi tiết mật mã có nghĩa là rất nhiều, vì vậy kết hợp với Argon2 là tương đối gần đây, tôi muốn đối xử với nó như một tùy chọn thực nghiệm
- Trong một thời gian dài, NET có một built-in một thực hiện PBKDF2 qua Rfc2898DeriveBytes lớp học. Tuy nhiên, việc triển khai chỉ có thể sử dụng hàm băm SHA-1, được coi là quá nhanh để bảo mật hiện nay
- Cuối cùng, giải pháp gần đây nhất là Microsoft.AspNetCore.Cryptography.KeyDerivation gói có sẵn qua NuGet. Nó cung cấp thuật toán PBKDF2 với hàm băm SHA-1, SHA-256 hoặc SHA-512, tốt hơn đáng kể so với
Rfc2898DeriveBytes
. Lợi thế lớn nhất ở đây là việc triển khai được cung cấp bởi Microsoft, và trong khi tôi không thể đánh giá đúng đắn sự tinh tấn về mật mã của các nhà phát triển Microsoft so với các nhà phát triển BCrypt.net hoặc libsodium, nó chỉ có ý nghĩa để tin tưởng nó bởi vì nếu bạn đang chạy một ứng dụng .NET, bạn đang phụ thuộc rất nhiều vào Microsoft rồi. Chúng tôi cũng có thể mong đợi Microsoft phát hành bản cập nhật nếu tìm thấy các vấn đề bảo mật. Hy vọng.
Để tóm tắt nghiên cứu cho đến thời điểm này, trong khi PBKDF2 có thể là thuật toán ít được ưu tiên nhất, khả năng cung cấp do Microsoft cung cấp vượt trội hơn, vì vậy quyết định hợp lý sẽ sử dụng Microsoft.AspNetCore.Cryptography.KeyDerivation
.
Gói gần đây tại thời điểm này nhắm mục tiêu .NET Standard 2.0, do đó có sẵn trong .NET Core 2.0 hoặc .NET Framework 4.6.1 trở lên. Nếu bạn sử dụng phiên bản khung trước đó, bạn có thể sử dụng phiên bản trước của gói, 1.1.3, nhắm mục tiêu Khuôn khổ .NET 4.5.1 hoặc .NET Core 1.0. Thật không may, nó không thể sử dụng nó trong các phiên bản .NET cũ hơn.
Tài liệu và ví dụ làm việc có sẵn tại docs.microsoft.com. Tuy nhiên, không sao chép-dán nó như nó được, vẫn còn có quyết định một nhà phát triển cần phải thực hiện.
Quyết định đầu tiên là hàm băm sử dụng. Các tùy chọn có sẵn bao gồm SHA-1, SHA-256 và SHA-512. Trong số đó, SHA-1 chắc chắn là quá nhanh để bảo mật, SHA-256 là tốt, nhưng tôi khuyên bạn nên sử dụng SHA-512, vì được cho là, hoạt động 64 bit của nó khiến cho việc tấn công dựa trên GPU trở nên khó khăn hơn.
Sau đó, bạn cần chọn độ dài đầu ra băm mật khẩu và độ dài muối. Nó không có ý nghĩa để có đầu ra dài hơn đầu ra hàm băm (ví dụ: 512 bit cho SHA-512), và nó có lẽ là an toàn nhất để có nó chính xác như thế. Đối với chiều dài muối, ý kiến khác nhau. 128 bit là đủ, nhưng trong mọi trường hợp, độ dài dài hơn độ dài đầu ra băm chắc chắn không cung cấp bất kỳ lợi ích nào.
Tiếp theo, có số lần lặp lại. Nó càng lớn thì các băm mật khẩu càng khó crack, nhưng mất nhiều thời gian hơn để đăng nhập người dùng. Tôi đề nghị chọn nó để băm băm mất 0,25 - 1 giây trên hệ thống sản xuất điển hình, và trong mọi trường hợp, nó không được nhỏ hơn 10000.
Thông thường, bạn sẽ nhận được mảng byte dưới dạng giá trị muối và giá trị băm. Sử dụng Base64 để chuyển đổi chúng thành chuỗi. Bạn có thể chọn sử dụng hai cột khác nhau trong cơ sở dữ liệu, hoặc kết hợp muối và mật khẩu trong một cột bằng cách sử dụng dấu tách không gặp phải trong Base64.
Đừng quên tạo bộ nhớ băm mật khẩu theo cách cho phép di chuyển liên tục sang thuật toán băm tốt hơn trong tương lai.
Bạn sẽ làm gì với mật khẩu băm? Lưu trữ nó trong một cơ sở dữ liệu? Sau đó, chỉ cần băm nhỏ là không đủ ([Bảng cầu vồng] (http://en.wikipedia.org/wiki/Rainbow_table)). Sử dụng muối. – dtb
Tôi sẽ lưu trữ nó trong cơ sở dữ liệu. Bạn đề xuất món gì. – Sean
Mọi người hãy lưu ý rằng các câu trả lời dưới đây sẽ hết hạn. Và hãy nhớ rằng bạn không bao giờ nên sử dụng MD5 cho mật khẩu băm nữa. Đó là cũ, bị hỏng, và lỗi thời. Giải pháp dễ dàng, cập nhật và an toàn nhất cho hầu hết mọi người sẽ là [bcrypt] (https://bcrypt.codeplex.com/). Ít nhất là khi bình luận này được viết :) Argon2 có lẽ sẽ là đề xuất chuẩn sớm thôi. – Sammi