MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mã hóa các trường mật khẩu trong mongodb

Theo nội dung cuộc trò chuyện trong phần nhận xét, ý bạn muốn nói là băm mật khẩu, không phải mã hóa mật khẩu. Bạn thường làm điều này với muối để ngăn chặn cuộc tấn công của bàn cầu vồng. Lưu trữ mật khẩu dưới dạng muối băm là tiêu chuẩn thực hành tốt nhất khi nói đến việc lưu trữ mật khẩu trong cơ sở dữ liệu.

Kể từ phiên bản 3.2, MongoDB không có hỗ trợ riêng cho băm mật khẩu như một số cơ sở dữ liệu SQL cung cấp, vì vậy bạn sẽ phải triển khai nó trong Java.

Để tạo tài khoản mới hoặc thay đổi mật khẩu của tài khoản hiện có:

  1. tạo giá trị muối ngẫu nhiên an toàn bằng mật mã với java.security.SecureRandom . Lớp này hoạt động giống như trình tạo số ngẫu nhiên tiêu chuẩn java.util.Random (đó là một lớp con) nhưng giao dịch hiệu suất để đạt được mức độ không thể đoán trước cao hơn nhiều, vốn cần thiết cho bối cảnh liên quan đến bảo mật.
  2. Tạo một chuỗi bằng cách nối muối và mật khẩu
  3. Tạo một hàm băm của chuỗi đó bằng một hàm băm an toàn bằng mật mã. Có rất nhiều hàm băm được cung cấp bởi Java, nhưng bạn muốn sử dụng một hàm cố ý khó tính toán để làm chậm kẻ tấn công có quyền truy cập cơ sở dữ liệu đang cố gắng ép buộc các hàm băm của bạn trên cụm siêu máy tính cục bộ của chúng. Một ứng cử viên tốt là thuật toán "PBKDF2WithHmacSHA1" được hỗ trợ bởi javax.crypto.SecretKeyFactory lớp học.
  4. Lưu tài liệu vào MongoDB với các trường username , password_hashpassword_salt (tất nhiên cộng với dữ liệu ứng dụng thực tế của bạn). Không lưu mật khẩu ban đầu.

Để truy xuất tài khoản:

  1. Đọc username_inputpassword_input người dùng bị cáo buộc đã nhập vào biểu mẫu đăng nhập của bạn.
  2. Truy xuất tài liệu có username khớp với username_input người dùng đã cung cấp.
  3. Lấy password_salt trường từ tài liệu đó
  4. Tạo một chuỗi bằng cách nối password_saltpassword_input giống như bạn đã làm trước đây.
  5. Tạo một hàm băm của chuỗi đó với cùng một hàm băm an toàn bằng mật mã.
  6. So sánh hàm băm với password_hash trường của tài liệu. Khi nó khớp, người dùng đã nhập đúng mật khẩu.

Ngoài ra, bạn chỉ có thể truy xuất các trường password_hash và password_salt của tài liệu và không tải phần còn lại trước khi người dùng được xác thực, nhưng tôi giả định rằng trong thế giới thực, nó sẽ gây ra nhiều tải hơn so với khả năng lưu. Những lần đăng nhập thành công thường sẽ nhiều hơn những lần đăng nhập không thành công, trừ khi bạn có kẻ tấn công cố gắng cưỡng bức tài khoản. Và trong trường hợp đó, bạn sẽ chặn kẻ tấn công bằng fail2ban hoặc một cơ chế giới hạn đăng nhập khác.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tôi có thể sử dụng $ project để trả về một trường làm tài liệu cấp cao nhất trong truy vấn tổng hợp mongo không?

  2. Truy vấn Mongo trên các trường con

  3. mongodb bản sao thành viên mới không hiển thị việc sử dụng đĩa chính xác trên EC2

  4. Tìm kiếm văn bản đối tượng lồng nhau trong mongoDB

  5. Tương đương với ERD cho MongoDB?