MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Шифроване на полета за пароли в mongodb

Според разговора в коментарите това, което имате предвид, е хеширане пароли, а не шифроване пароли. Обикновено бихте направили това със сол, за да предотвратите атака на Rainbow Table. Съхраняването на пароли като солирани хешове е стандартът за най-добра практика, когато става въпрос за съхраняване на пароли в бази данни.

От версия 3.2 MongoDB няма вградена поддръжка за хеширане на пароли, както предоставят някои SQL бази данни, така че ще трябва да го внедрите в Java.

За да генерирате нов акаунт или да промените паролата на съществуващ акаунт:

  1. генериране на криптографски защитена произволна солна стойност с java.security.SecureRandom . Този клас работи точно като стандартния генератор на случайни числа java.util.Random (това е подклас), но търгува с производителност за много по-високо ниво на непредвидимост, което се изисква за контекст, свързан със сигурността.
  2. Създайте низ чрез свързване на сол и парола
  3. Генерирайте хеш на този низ с криптографски защитена хеш функция. Има много хеш функции, предоставени от Java извън кутията, но вие искате да използвате такава, която умишлено е трудна за изчисляване, за да забавите нападател с достъп до базата данни, който се опитва да форсира вашите хешове на техния локален суперкомпютърен клъстер. Добър кандидат е алгоритъмът „PBKDF2WithHmacSHA1“, който се поддържа от javax.crypto.SecretKeyFactory клас.
  4. Запазете документа в MongoDB с полетата username , password_hash и password_salt (плюс вашите действителни данни за приложението, разбира се). Не запазвайте оригиналната парола.

За да извлечете акаунт:

  1. Прочетете username_input и password_input предполагаемият потребител е въвел във вашата форма за вход.
  2. Извличане на документа, където username съответства на username_input предоставен от потребителя.
  3. Вземете password_salt поле от този документ
  4. Създайте низ чрез свързване на password_salt и password_input точно както правехте преди.
  5. Генерирайте хеш на този низ със същата криптографски защитена хеш функция.
  6. Сравнете хеша с password_hash поле на документа. Когато съвпада, потребителят е въвел правилната парола.

Като алтернатива можете да извлечете само полетата password_hash и password_salt на документа и да не зареждате останалите, преди потребителят да бъде удостоверен, но предполагам, че в реалния свят това ще причини повече натоварване, отколкото би спестило. Успешните влизания обикновено ще са много повече от неуспешните, освен ако нямате нападател, който се опитва да форсира акаунт с груба сила. И в такъв случай бихте блокирали нападателя с fail2ban или друг механизъм за ограничаване на влизането.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Мога ли да използвам $project, за да върна поле като документ от най-високо ниво в заявка за агрегиране на mongo?

  2. Консистенция „Четете сами-пишете“ в Mongodb

  3. Mongodb $push във вложен масив

  4. Проблем с Node + Mongodb + ISODate + Timezone

  5. PyMongo max_time_ms