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:
- genera un valore salt casuale crittograficamente sicuro con
java.security.SecureRandom
. Questa classe funziona proprio come il generatore di numeri casuali standardjava.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. - Crea una stringa concatenando salt e password
- 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. - Salva il documento in MongoDB con i campi
username
,password_hash
epassword_salt
(più i dati effettivi dell'applicazione, ovviamente). Non salvare la password originale.
Per recuperare un account:
- Leggi il
username_input
epassword_input
il presunto utente ha inserito il tuo modulo di accesso. - Recupera il documento in cui si trova il
username
corrisponde ausername_input
fornito dall'utente. - Ottieni il
password_salt
campo da quel documento - Crea una stringa concatenando
password_salt
epassword_input
proprio come hai fatto prima. - Genera un hash di quella stringa con la stessa funzione hash crittograficamente sicura.
- 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.