2015-03-09 10 views
8

Ho il seguente codice, inserisce il userName e password nel database ma la password è memorizzata in formato di testo normale. Voglio dire quando guarderò nel db posso vedere la password inserita.Encrypt password fields in mongodb

voglio conservare password in formato 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); 

Come posso raggiungere questo obiettivo?

+0

La crittografia deve essere eseguita nella codifica Java. Dai un'occhiata alle tecniche di crittografia password - PBKDF2 o bcrypt o scrypt –

+0

Quindi usa il metodo per crittografare la stringa. I database archiviano solo ciò che gli chiedi. Non esiste un tipo di campo "crittografato" e MongoDB è "schemaless", quindi non ci sono "tipi di campo". Questo è il codice da implementare. –

+2

Non si desidera crittografare la password ma hash - grande differenza. [https://crackstation.net/hashing-security.htm](https://crackstation.net/hashing-security.htm) è una guida su come farlo correttamente. – jHilscher

risposta

14

Secondo la conversazione nei commenti, cosa vuoi dire è hashing password, non la crittografia password. Solitamente lo faresti con un sale per prevenire un attacco da tavolo arcobaleno. Memorizzare le password come hash salati è lo standard migliore per quanto riguarda la memorizzazione delle password nei database.

A partire dalla versione 3.2, MongoDB non ha alcun supporto nativo per l'hashing delle password come alcuni database SQL forniscono, quindi sarà necessario implementarlo in Java.

per generare un nuovo account o modificare la password di un account esistente:

  1. generano un valore salt casuale crittograficamente sicuro con java.security.SecureRandom. Questa classe funziona proprio come il generatore di numeri casuali standard java.util.Random (è una sottoclasse) ma scambia le prestazioni per un livello molto più elevato di non prevedibilità che è richiesto per un contesto rilevante per la sicurezza.
  2. Creare una stringa concatenando sale e password
  3. Generare un hash di tale stringa con una funzione hash crittograficamente protetta. Esistono molte funzioni hash fornite da Java out-of-the-box, ma si desidera utilizzarne una che sia intenzionalmente difficile da calcolare per rallentare un utente malintenzionato con accesso al database che tenta di eseguire la forza bruta sugli hash sul cluster locale di supercomputer. Un buon candidato è l'algoritmo "PBKDF2WithHmacSHA1" supportato dalla classe javax.crypto.SecretKeyFactory.
  4. Salvare il documento in MongoDB con i campi username, password_hash e password_salt (oltre ai dati di applicazione effettivi, ovviamente). Non salvare la password originale.

Per recuperare un account:

  1. Leggere il username_input e password_input il presunto utente immesso nel modulo di login.
  2. Recupera il documento in cui lo username corrisponde allo username_input fornito dall'utente.
  3. Prendi il campo password_salt da quel documento
  4. creare una stringa concatenando password_salt e password_input proprio come avete fatto prima.
  5. Genera un hash di quella stringa con la stessa funzione hash crittograficamente protetta.
  6. Confrontare l'hash con il campo password_hash del documento. Quando corrisponde, l'utente ha inserito la password corretta.

Si potrebbe in alternativa, recuperare solo i campi password_hash e password_salt del documento e non caricare il resto prima che l'utente è autenticato, ma presumo che nel mondo reale che verrà causare un carico maggiore di quanto non lo avrebbe salvato. Gli accessi riusciti di solito superano di gran lunga quelli che non hanno successo, a meno che tu non abbia un aggressore che cerca di forzare un account. E in tal caso si bloccherebbe l'aggressore con fail2ban o un altro meccanismo di limitazione dell'accesso.