2015-03-09 16 views
8

Mam następujący kod, wstawia on userName i password do bazy danych , ale hasło jest przechowywane w formacie zwykłego tekstu. Mam na myśli, kiedy zajrzę do bazy danych, mogę zobaczyć wprowadzone hasło.Szyfrowanie pól hasła w mongodb

Chcę przechowywać password w formacie encrypted

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); 

W jaki sposób można to osiągnąć?

+0

Szyfrowanie należy wykonać w języku Java. Zapoznaj się z technikami szyfrowania haseł - PBKDF2 lub bcrypt lub scrypt –

+0

Tak więc użyj metody szyfrowania ciągu. Bazy danych przechowują tylko to, o co ich prosisz. Nie ma "zaszyfrowanego" typu pola, a MongoDB to "bezzasadne", więc nie ma "typów pól". To dla twojego kodu do zaimplementowania. –

+2

Nie chcesz szyfrować hasła, ale hash to - duża różnica. [https://crackstation.net/hashing-security.htm](https://crackstation.net/hashing-security.htm) to przewodnik, jak to zrobić właściwie. – jHilscher

Odpowiedz

14

Zgodnie z rozmową w komentarzach, co masz na myśli to mieszania haseł, szyfrowanie nie haseł. Zwykle robisz to z solą, aby zapobiec atakowi stołów tęczowych. Przechowywanie haseł jako solonych haszów jest najlepszym standardem, jeśli chodzi o przechowywanie haseł w bazach danych.

Począwszy od wersji 3.2, MongoDB nie ma natywnej obsługi hashowania haseł, podobnie jak niektóre bazy danych SQL, więc będziesz musiał zaimplementować ją w Javie.

Aby wygenerować nowe konto lub zmienić hasło istniejącego konta:

  1. generowania zaszyfrowanych losową wartość soli z java.security.SecureRandom. Ta klasa działa tak, jak standardowy generator liczb losowych java.util.Random (jest to podklasa), ale handluje wydajnością o znacznie wyższym poziomie nieprzewidywalności, który jest wymagany w kontekście związanym z bezpieczeństwem.
  2. Utwórz łańcuch, łącząc sól i hasło.
  3. Wygeneruj skrót tego łańcucha za pomocą kryptograficznie bezpiecznej funkcji skrótu. Istnieje wiele funkcji mieszających udostępnianych przez Javę bezpośrednio po zainstalowaniu, ale chcesz użyć takiego, który jest intencjonalnie trudny do obliczenia, aby spowolnić atakującego przy dostępie do bazy danych, próbując brutalnie wymusić hasze w lokalnym klastrze superkomputerów. Dobrym kandydatem jest algorytm "PBKDF2WithHmacSHA1" obsługiwany przez klasę javax.crypto.SecretKeyFactory.
  4. Zapisz dokument w MongoDB za pomocą pól username, password_hash i password_salt (oprócz rzeczywistych danych aplikacji). Nie zapisuj oryginalnego hasła.

Aby odzyskać konto:

  1. Przeczytaj username_input i password_input domniemany użytkownik wprowadził do formularza logowania.
  2. Pobierz dokument, w którym username pasuje do podanego użytkownika, podanego w .
  3. Get pola password_salt z tego dokumentu
  4. Tworzenie ciąg przez złączenie password_salt i password_input tak jak przedtem.
  5. Wygeneruj skrót tego łańcucha za pomocą tej samej kryptograficznie bezpiecznej funkcji skrótu.
  6. Porównaj hasz z polem password_hash dokumentu. Kiedy się zgadza, użytkownik wprowadził poprawne hasło.

Mogłeś alternatywnie tylko odzyskać password_hash i password_salt pól dokumentu i nie załadować resztę zanim użytkownik jest uwierzytelniony, ale zakładam, że w świecie rzeczywistym, spowoduje to większe obciążenie niż by go zapisać. Pomyślne logowanie zazwyczaj znacznie przewyższa liczbę nieudanych, chyba że masz atakującego, który próbuje zmusić konto do wymuszenia. W takim przypadku można zablokować napastnika za pomocą fail2ban lub innego mechanizmu ograniczającego logowanie.