Шифрование пароля с помощью Spring / Hibernate - Jasypt или что-то еще?[закрыто]
-
21-08-2019 - |
Вопрос
В стеке приложений Java с Spring & Hibernate (JPA) на уровне доступа к данным, каковы хорошие методы применения шифрования паролем (надеюсь, с использованием аннотаций), и где вы можете узнать больше о том, как это сделать (учебное пособие и т.д.)?
Понятно, что я бы использовал JCA поддерживаемый алгоритм шифрования паролей, но я бы предпочел не реализовывать логику оболочки, если есть простой способ.
Я смотрел на Jasypt, и мне было а) интересно, хороший ли это вариант и как это сделать, и б) что еще люди используют для этого.Если кто-то использует Jasypt или альтернативу, расскажите подробнее о вашем опыте, это было бы здорово.
Решение
Java уже имеет все необходимые библиотеки, предоставленные для вас.Просто создайте служебный метод, который реализует хеширование с помощью соли, как описано в OWASP ( ОВАСП ).
Если вы действительно не хотите владеть этим кодом и не возражаете против дополнительной зависимости, похоже, что Широ библиотека (ранее Jбезопасность) имеет реализация из того, что описано OWASP.
Также похоже, что библиотека JASYPT, о которой вы упомянули, имеет аналогичная полезность.
Я понимаю, что в этом ответе не упоминаются Spring или Hibernate, но мне не ясно, как вы надеетесь использовать их в этом сценарии.
Другие советы
Вы можете использовать Jasypt с Гибернацией зашифровать или хэшировать ваши свойства "на лету", если это то, что вы ищете.Фактический алгоритм вычисления дайджестов (хэшей) довольно прост с использованием JCE, если вы также хотите создать свой собственный.
MD5 или SHA-256 подошли бы, хотя MD5 сейчас можно взломать.
Возможно, я неправильно понял проблему, но это должно быть просто сравнение хэшированных паролей.
В режиме гибернации просто сохраняйте в виде строки.На стороне проверки используйте метод, подобный:
public validate(String user, String pass)
{
if(getUser(user).getPass().equals(getHash(pass)))
return true;
return false;
}
Похоже, что для спящего режима не существует конкретного способа сделать это с Jasypt, но вы можете настроить средство шифрования пароля в Spring:
<!--
Set up string digester here so we can configure it for more pools if it's a problem...
-->
<bean id="stringDigester" class="org.jasypt.digest.PooledStringDigester">
<!-- same settings as StrongPasswordGenerator -->
<property name="poolSize" value="2"/>
<property name="algorithm" value="SHA-256"/>
<property name="iterations" value="100000"/>
<property name="saltGenerator">
<bean class="org.jasypt.salt.RandomSaltGenerator"/>
</property>
<property name="saltSizeBytes" value="16"/>
</bean>
<!-- ...and then we only have to deal with the passwordEncryptor interface in code. -->
<bean id="passwordEncryptor" class="com.myproject.util.StringPasswordEncryptor">
<property name="stringDigester" ref="stringDigester"/>
</bean>
После этого вы вызываете context.getBean("PasswordEncryptor"), чтобы получить шифровальщик, а затем вызываете либо encryptPassword(), либо CheckPassword().
Если вы используете Spring в своем приложении, то вы также можете использовать Пружинная Безопасность, который предоставляет вам несколько кодеров паролей, т.е. Кодировщик ShaPasswordEncoder Вы можете найти его на Переполнение стека
Я просто использую что-то похожее на SHA-256(username + ":" + password + ":" + salt)
и сохраните его в базе данных в 64-символьном столбце под названием passwd.
В Википедии говорится, что касается солей:"Данные Salt усложняют атаки по словарю, которые используют предварительное шифрование словарных записей:каждый бит используемой соли удваивает объем требуемых ресурсов хранения и вычислений....Для обеспечения наилучшей безопасности значение salt хранится в секрете отдельно от базы данных паролей.Это дает преимущество, когда база данных украдена, но соль в другом ".
Итак, чтобы пройти аутентификацию, получите пользователя из базы данных с указанным именем пользователя, затем сгенерируйте тот же хэш, используя пароль, предоставленный при попытке входа в систему, и сравните с тем, что есть в базе данных.Также добавьте некоторое ограничение скорости для попыток входа в систему (например, 5 за 5-минутный период).Если пользователь забыл свой пароль, НИКОГДА НЕ отправляйте ему пароль по электронной почте (поскольку он у вас не будет сохранен) и не отправляйте ему по электронной почте новый сгенерированный пароль, но отправьте ему ссылку для изменения этого пароля с ключом смены пароля / одноразовым номером / salt в URL, который вы можете проверить.