Подтвердить что ты не робот

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

В стеке приложений Java с Spring и Hibernate (JPA) на уровне доступа к данным, какие хорошие методы применения шифрования паролей (надеюсь, вы используете аннотации), и где вы можете узнать больше о его выполнении ( учебник и т.д.)?

Понятно, что я бы использовал JCA поддерживаемый алгоритм шифрования паролей, но я бы предпочел не реализовывать логику оболочки, если есть простой способ.

Я смотрел на Jasypt, и был a) интересно, если это хороший вариант и как это сделать, и б) что еще люди используют для этого. Если кто-либо использует Jasypt или альтернативу, детали вашего опыта это было бы здорово.

4b9b3361

Ответ 1

В Java есть все необходимые библиотеки, которые уже предоставлены вам. Просто создайте полезный метод, который реализует хеширование с солью, как описано в OWASP.

Если вы действительно не хотите владеть этим кодом и не возражаете против дополнительной зависимости, кажется, что Shiro (ранее JSecurity) имеет реализация того, что описано OWASP.

Также похоже, что у библиотеки JASYPT, которую вы упомянули, есть аналогичная утилита.

Я понимаю, что в этом ответе не упоминается Spring или Hibernate, но я не понимаю, как вы надеетесь использовать их в этом сценарии.

Ответ 2

Вы можете использовать Jasypt with Hibernate для шифрования или хэширования ваших свойств на лету, если это то, что вы ищете. Фактический алгоритм вычисления дайджеста (хэши) довольно прост, используя JCE, если вы хотите также свернуть свой собственный.

Ответ 3

MD5 или SHA-256 были бы точными, хотя теперь MD5 взломан.

Возможно, я неправильно понял проблему, но это должно быть просто сравнение хешированных паролей.

В спящем режиме просто сохраните как строку. На стороне проверки есть способ, например:

public validate(String user, String pass)
{
    if(getUser(user).getPass().equals(getHash(pass)))
        return true;
    return false;
}

Ответ 4

Как представляется, для Jasypt не существует способа Hibernate, но вы можете настроить шифровальный шифр в Spring:

  <!-- 
   Set up string digester here so we can configure it for more pools if it 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().

Ответ 6

Я просто использую нечто похожее на SHA-256(username + ":" + password + ":" + salt) и сохраняю его в базе данных в 64-символьном столбце с именем passwd.

Википедия говорит, что касается солей: "Солевые данные усложняют словарные атаки, которые используют предварительное шифрование словарных статей: каждый бит соли используется удваивает объем хранения и вычислений.... Для лучшей безопасности значение соли хранится в секрете, отдельно от базы данных паролей, что дает преимущество при краже базы данных, но соль - нет."

Итак, чтобы аутентифицироваться, заведите пользователя из базы данных с предоставленным именем пользователя, затем сгенерируйте тот же хэш, используя пароль, предоставленный через их попытку входа, и сравните с таковой в базе данных. Также добавьте ограничение скорости для попыток входа (например, 5 в течение 5-минутного периода). Если пользователь забудет свой пароль, НИКОГДА не отправляйте им пароль (так как вы его не сохраните) и не отправляйте им новый сгенерированный пароль, но напишите им ссылку, чтобы изменить этот пароль с ключом пароля изменения /nonce/salt в URL, который вы можете проверить.