2015-03-09 27 views
8

Tôi có mã sau, nó chèn userNamepassword vào cơ sở dữ liệu nhưng mật khẩu được lưu trữ ở định dạng văn bản thuần túy. Ý tôi là khi tôi nhìn vào db tôi có thể thấy mật khẩu được chèn vào.Mã hóa các trường mật khẩu trong mongodb

Tôi muốn lưu trữ ở định dạng passwordencrypted

MongoClient client = new MongoClient("localhost",27017); 
DB db = client.getDB("Test"); 
DBCollection collection = db.getCollection("EncryptionDemo"); 
BasicDBObject documentDetail = new BasicDBObject(); 
documentDetail.put("userName", "admin12"); 
documentDetail.put("password", "12345"); 
collection.insert(documentDetail); 

Làm thế nào tôi có thể đạt được điều này?

+0

Việc mã hóa phải được thực hiện bằng mã Java. Có một cái nhìn về kỹ thuật mã hóa mật khẩu - PBKDF2 hoặc bcrypt hoặc scrypt –

+0

Vì vậy, sử dụng phương pháp để mã hóa chuỗi. Cơ sở dữ liệu chỉ lưu trữ những gì bạn yêu cầu. Không có kiểu "mã hóa" của trường và MongoDB là "schemaless", do đó không có "loại trường". Đó là mã của bạn để triển khai. –

+2

Bạn không muốn mã hóa mật khẩu nhưng băm nó - sự khác biệt lớn. [https://crackstation.net/hashing-security.htm](https://crackstation.net/hashing-security.htm) là hướng dẫn cách thực hiện đúng cách. – jHilscher

Trả lời

14

Theo cuộc trò chuyện trong nhận xét, ý của bạn là mật khẩu băm, không phải mã hóa mật khẩu. Bạn thường sẽ làm điều này với một muối để ngăn chặn một cuộc tấn công bảng cầu vồng. Lưu trữ mật khẩu như băm muối là tiêu chuẩn thực hành tốt nhất khi nói đến 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ợ gốc 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 một 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 ra một giá trị muối ngẫu nhiên mã hóa an toàn 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 phân lớp) nhưng giao dịch thực hiện cho một mức độ cao hơn không thể dự đoán trước được yêu cầu cho một ngữ cảnh liên quan đến bảo mật.
  2. Tạo chuỗi bằng cách nối muối và mật khẩu
  3. Tạo một mã băm của chuỗi đó bằng hàm băm mật mã an toàn. Có rất nhiều hàm băm được cung cấp bởi Java out-of-the-box, nhưng bạn muốn sử dụng một trong đó là cố ý để tính toán để làm chậm một kẻ tấn công với truy cập cơ sở dữ liệu cố gắng brute-force băm của bạn trên cụm siêu máy tính cục bộ của họ. Một ứng cử viên tốt là thuật toán "PBKDF2WithHmacSHA1" được hỗ trợ bởi lớp javax.crypto.SecretKeyFactory.
  4. Lưu tài liệu vào MongoDB với các trường username, password_hashpassword_salt (cộng với dữ liệu ứng dụng thực tế của bạn, tất nhiên). Không lưu mật khẩu ban đầu.

Để lấy một tài khoản:

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

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 cho rằng trong thế giới thực nó sẽ gây tải nhiều hơn lưu. Các thông tin đăng nhập thành công thường sẽ lớn hơn rất nhiều so với số lần đăng nhập không thành công, trừ khi bạn có kẻ tấn công cố gắng gây bạo lực cho 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 cơ chế hạn chế đăng nhập khác.

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