Ifølge samtalen i kommentarerne er det du mener hashing adgangskoder, ikke kryptering adgangskoder. Du ville normalt gøre dette med et salt for at forhindre et regnbuebordsangreb. Lagring af adgangskoder som saltede hashes er den bedste praksis-standard, når det kommer til lagring af adgangskoder i databaser.
Fra version 3.2 har MongoDB ingen indbygget understøttelse af adgangskode-hashing, som nogle SQL-databaser giver, så du bliver nødt til at implementere det i Java.
Sådan genererer du en ny konto eller ændrer adgangskoden til en eksisterende konto:
- generer en kryptografisk sikker tilfældig saltværdi med
java.security.SecureRandom
. Denne klasse fungerer ligesom standardgeneratoren for tilfældige tal java.util.Random (det er en underklasse), men bytter ydeevne for et meget højere niveau af uforudsigelighed, som er påkrævet for en sikkerhedsrelevant kontekst. - Opret en streng ved at sammenkæde salt og adgangskode
- Generer en hash af denne streng med en kryptografisk sikker hash-funktion. Der er mange hash-funktioner leveret af Java ud af boksen, men du vil bruge en, som med vilje er svær at beregne for at bremse en angriber med databaseadgang, der forsøger at brute-force dine hashes på deres lokale supercomputer-klynge. En god kandidat er "PBKDF2WithHmacSHA1"-algoritmen, som understøttes af
javax.crypto.SecretKeyFactory
klasse. - Gem dokumentet i MongoDB med felterne
brugernavn
,password_hash
ogpassword_salt
(plus dine faktiske ansøgningsdata, selvfølgelig). Gem ikke den originale adgangskode.
Sådan hentes en konto:
- Læs
brugernavn_input
ogpassword_input
den påståede bruger indtastede i din login-formular. - Hent dokumentet med
brugernavn
matcherbrugernavn_input
den angivne bruger. - Hent
password_salt
felt fra det pågældende dokument - Opret en streng ved at sammenkæde
password_salt
ogpassword_input
ligesom du gjorde før. - Generer en hash af denne streng med den samme kryptografisk sikre hashfunktion.
- Sammenlign hashen med
password_hash
dokumentets felt. Når den matcher, har brugeren indtastet den korrekte adgangskode.
Du kan alternativt kun hente felterne password_hash og password_salt i dokumentet og ikke indlæse resten før brugeren er autentificeret, men jeg vil antage, at det i den virkelige verden vil forårsage mere belastning, end det ville spare. Succesfulde logins vil normalt være langt flere end de mislykkede, medmindre du har en angriber, der forsøger at brute-force en konto. Og i så fald ville du blokere angriberen med fail2ban eller en anden login-begrænsende mekanisme.