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

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

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

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

6 ответов


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

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

Он также выглядит как библиотека JASYPT вы упомянули, имеет похожие утилиты.

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


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


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

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

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

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

Кажется, что нет конкретного способа сделать это с помощью Jasypt, но вы можете настроить шифратор паролей весной:

  <!-- 
   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 Вы можете найти его на StackOverflow


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

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

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