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

Krypter adgangskodefelter i mongodb

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:

  1. 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.
  2. Opret en streng ved at sammenkæde salt og adgangskode
  3. 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.
  4. Gem dokumentet i MongoDB med felterne brugernavn , password_hash og password_salt (plus dine faktiske ansøgningsdata, selvfølgelig). Gem ikke den originale adgangskode.

Sådan hentes en konto:

  1. Læs brugernavn_input og password_input den påståede bruger indtastede i din login-formular.
  2. Hent dokumentet med brugernavn matcher brugernavn_input den angivne bruger.
  3. Hent password_salt felt fra det pågældende dokument
  4. Opret en streng ved at sammenkæde password_salt og password_input ligesom du gjorde før.
  5. Generer en hash af denne streng med den samme kryptografisk sikre hashfunktion.
  6. 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.



  1. Mongoose:CastError:Cast to ObjectId mislykkedes for værdien "mig" ved stien "_id"

  2. Sådan grupperes data ved hjælp af mongo-skabelon

  3. Vedligeholdelse af MongoDB Replica Sets i skyen ved hjælp af Ansible

  4. Oprettelse af korte, unikke objekt-id'er i MongoDB