Đầu tiên, một số thuật ngữ quan trọng:
Băm - Hành động lấy một chuỗi và tạo ra một chuỗi các ký tự không thể được hoàn nguyên về chuỗi ban đầu.
Mã hóa đối xứng - (Thường chỉ được gọi là 'mã hóa') - Hành động lấy một chuỗi và tạo ra một chuỗi các ký tự có thể được giải mã thành chuỗi gốc thông qua việc sử dụng cùng một khóa mã hóa đã mã hóa nó.
Bảng cầu vồng - một bảng tra cứu có chứa tất cả các biến thể của các ký tự được băm trong một thuật toán băm cụ thể.
Muối - một chuỗi ngẫu nhiên đã biết được nối vào chuỗi gốc trước khi nó được băm.
Đối với .NET Framework, Bcrypt chưa có triển khai tham chiếu đã được xác minh . Điều này rất quan trọng vì không có cách nào để biết liệu có những sai sót nghiêm trọng trong việc triển khai hiện có hay không. Bạn có thể nhận được một triển khai BCrypt cho .NET tại đây . Tôi không biết đủ về mật mã để nói liệu đó là một triển khai tốt hay xấu. Mật mã học là một lĩnh vực rất sâu sắc. Đừng cố gắng xây dựng thuật toán mã hóa của riêng bạn . Nghiêm túc.
Nếu bạn định thực hiện bảo mật mật khẩu của riêng mình (thở dài), thì bạn cần phải làm một số điều:
- Sử dụng thuật toán băm tương đối an toàn .
- Muối từng mật khẩu trước khi băm.
- Sử dụng một loại muối duy nhất và dài cho mỗi mật khẩu và lưu trữ muối với mật khẩu.
- Yêu cầu mật khẩu mạnh .
Thật không may, ngay cả khi bạn làm tất cả những điều này, một hacker quyết tâm vẫn có khả năng tìm ra mật khẩu, nó sẽ khiến anh ta mất một thời gian rất dài. Đó là kẻ thù chính của bạn: Thời gian .
Các thuật toán bcrypt làm việc vì phải mất lăm bậc độ lớn thời gian để băm mật khẩu hơn MD5 ; (và vẫn dài hơn AES hoặc SHA-512). Nó buộc tin tặc phải mất nhiều thời gian hơn để tạo một bảng cầu vồng để tra cứu mật khẩu của bạn, khiến cho khả năng mật khẩu của bạn sẽ có nguy cơ bị hack cao hơn rất nhiều.
Nếu bạn đang muối và băm mật khẩu của mình và mỗi loại muối khác nhau, thì một hacker tiềm năng sẽ phải tạo một bảng cầu vồng cho mỗi biến thể của muối , chỉ cần có một bảng cầu vồng cho một mật khẩu được băm + băm. Điều đó có nghĩa là nếu bạn có 1 triệu người dùng, một hacker phải tạo ra 1 triệu bảng cầu vồng. Nếu bạn đang sử dụng cùng một loại muối cho mọi người dùng, thì hacker chỉ phải tạo 1 bảng cầu vồng để hack thành công hệ thống của bạn.
Nếu bạn không muối mật khẩu của mình, thì tất cả kẻ tấn công phải làm là kéo lên một bảng Rainbow hiện có cho mọi triển khai ngoài đó (AES, SHA-512, MD5) và chỉ xem liệu có khớp với hàm băm không. Điều này đã được thực hiện , kẻ tấn công không cần phải tự tính toán các bảng Rainbow này .
Ngay cả với tất cả điều này, bạn đã được sử dụng các thực hành bảo mật tốt . Nếu họ có thể sử dụng thành công một vectơ tấn công khác (XSS, SQL Injection, CSRF và cộng sự ) trên trang web của bạn, bảo mật mật khẩu tốt không thành vấn đề. Nghe có vẻ như là một tuyên bố gây tranh cãi, nhưng hãy nghĩ về nó: Nếu tôi có thể lấy tất cả thông tin người dùng của bạn thông qua một cuộc tấn công SQL, hoặc tôi có thể khiến người dùng của bạn đưa cho tôi cookie của họ thông qua XSS, thì vấn đề là mật khẩu của bạn tốt đến mức nào an ninh là thế .
Các nguồn lực khác:
- Jeff Atwood: .NET Encoding Đơn giản hóa (tuyệt vời cho tổng quan về băm)
- Jeff Atwood: Tôi vừa đăng nhập với tư cách là bạn
- Jeff Atwood: Có lẽ bạn đang lưu trữ mật khẩu không chính xác
- Jeff Atwood: Tốc độ băm
Lưu ý: Vui lòng giới thiệu các tài nguyên tốt khác. Tôi đã phải đọc hàng tá bài viết của hàng tá tác giả, nhưng ít người viết đơn giản về chủ đề như Jeff. Vui lòng chỉnh sửa trong các bài viết khi bạn tìm thấy chúng.