Според разговора в коментарите това, което имате предвид, е хеширане пароли, а не шифроване пароли. Обикновено бихте направили това със сол, за да предотвратите атака на Rainbow Table. Съхраняването на пароли като солирани хешове е стандартът за най-добра практика, когато става въпрос за съхраняване на пароли в бази данни.
От версия 3.2 MongoDB няма вградена поддръжка за хеширане на пароли, както предоставят някои SQL бази данни, така че ще трябва да го внедрите в Java.
За да генерирате нов акаунт или да промените паролата на съществуващ акаунт:
- генериране на криптографски защитена произволна солна стойност с
java.security.SecureRandom
. Този клас работи точно като стандартния генератор на случайни числаjava.util.Random
(това е подклас), но търгува с производителност за много по-високо ниво на непредвидимост, което се изисква за контекст, свързан със сигурността. - Създайте низ чрез свързване на сол и парола
- Генерирайте хеш на този низ с криптографски защитена хеш функция. Има много хеш функции, предоставени от Java извън кутията, но вие искате да използвате такава, която умишлено е трудна за изчисляване, за да забавите нападател с достъп до базата данни, който се опитва да форсира вашите хешове на техния локален суперкомпютърен клъстер. Добър кандидат е алгоритъмът „PBKDF2WithHmacSHA1“, който се поддържа от
javax.crypto.SecretKeyFactory
клас. - Запазете документа в MongoDB с полетата
username
,password_hash
иpassword_salt
(плюс вашите действителни данни за приложението, разбира се). Не запазвайте оригиналната парола.
За да извлечете акаунт:
- Прочетете
username_input
иpassword_input
предполагаемият потребител е въвел във вашата форма за вход. - Извличане на документа, където
username
съответства наusername_input
предоставен от потребителя. - Вземете
password_salt
поле от този документ - Създайте низ чрез свързване на
password_salt
иpassword_input
точно както правехте преди. - Генерирайте хеш на този низ със същата криптографски защитена хеш функция.
- Сравнете хеша с
password_hash
поле на документа. Когато съвпада, потребителят е въвел правилната парола.
Като алтернатива можете да извлечете само полетата password_hash и password_salt на документа и да не зареждате останалите, преди потребителят да бъде удостоверен, но предполагам, че в реалния свят това ще причини повече натоварване, отколкото би спестило. Успешните влизания обикновено ще са много повече от неуспешните, освен ако нямате нападател, който се опитва да форсира акаунт с груба сила. И в такъв случай бихте блокирали нападателя с fail2ban или друг механизъм за ограничаване на влизането.