MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Crittografa i campi password in mongodb

Secondo la conversazione nei commenti, ciò che intendi è hashing password, non crittografare Le password. Di solito lo faresti con un sale per prevenire un attacco al tavolo arcobaleno. La memorizzazione delle password come hash salati è lo standard di best practice quando si tratta di archiviare le password nei database.

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

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

  1. genera 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 con un livello di non prevedibilità molto più elevato, richiesto per un contesto rilevante per la sicurezza.
  2. Crea una stringa concatenando salt e password
  3. Genera un hash di quella stringa con una funzione hash crittograficamente sicura. Esistono molte funzioni hash fornite da Java pronte all'uso, ma se ne desidera utilizzare una intenzionalmente difficile da calcolare per rallentare un utente malintenzionato con accesso al database che tenta di forzare i propri hash sul cluster di supercomputer locale. Un buon candidato è l'algoritmo "PBKDF2WithHmacSHA1", supportato da javax.crypto.SecretKeyFactory classe.
  4. Salva il documento in MongoDB con i campi username , password_hash e password_salt (più i dati effettivi dell'applicazione, ovviamente). Non salvare la password originale.

Per recuperare un account:

  1. Leggi il username_input e password_input il presunto utente ha inserito il tuo modulo di accesso.
  2. Recupera il documento in cui si trova il username corrisponde a username_input fornito dall'utente.
  3. Ottieni il password_salt campo da quel documento
  4. Crea una stringa concatenando password_salt e password_input proprio come hai fatto prima.
  5. Genera un hash di quella stringa con la stessa funzione hash crittograficamente sicura.
  6. Confronta l'hash con il password_hash campo del documento. Quando corrisponde, l'utente ha inserito la password corretta.

In alternativa potresti recuperare solo i campi password_hash e password_salt del documento e non caricare il resto prima che l'utente sia autenticato, ma suppongo che nel mondo reale causerà più carico di quanto ne salverebbe. Gli accessi riusciti di solito superano di gran lunga quelli non riusciti, a meno che tu non abbia un utente malintenzionato che tenta di forzare un account. E in tal caso bloccheresti l'attaccante con fail2ban o un altro meccanismo di limitazione dell'accesso.