Шифрование пароля с помощью Spring / Hibernate - Jasypt или что-то еще?[закрыто]

StackOverflow https://stackoverflow.com/questions/1075128

Вопрос

В стеке приложений 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, который вы можете проверить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top