17

在数据访问层中使用 Spring 和 Hibernate (JPA) 的 Java 应用程序堆栈中,应用密码加密的好方法是什么(希望使用注释),您在哪里可以找到有关完成它的更多信息(教程等)?

据了解,我将使用JCA支持的算法来加密密码,但如果有简单的方法,我宁愿不必实现包装器逻辑。

我在看Jasypt,并且a)想知道这是否是一个好的选择以及如何去做,b)人们还在为此使用什么。如果有人在使用 Jasypt 或替代方案,请详细说明您的体验,那就太好了。

4

6 回答 6

7

Java 已经为您提供了所有必需的库。只需创建一个实用方法,如OWASP所述,使用盐实现散列。

如果您真的不想拥有该代码并且不介意额外的依赖,那么Shiro库(以前称为JSecurity)似乎具有OWASP 描述的实现。

您提到的 JASYPT 库看起来也有类似的实用程序

我意识到这个答案没有提到 Spring 或 Hibernate,但我不清楚您希望如何在这种情况下使用它们。

于 2009-07-02T16:51:49.047 回答
5

如果您正在寻找什么,您可以使用Jasypt 和 Hibernate来动态加密或散列您的属性。如果您也想自己动手,使用 JCE 计算摘要(哈希)的实际算法非常简单。

于 2009-07-02T16:53:40.980 回答
2

MD5 或 SHA-256 就可以了,尽管 MD5 现在可以破解了。

也许我误解了这个问题,但它应该只是比较散列密码。

在休眠状态下,只需存储为字符串。在验证方面,有一个方法,如:

public validate(String user, String pass)
{
    if(getUser(user).getPass().equals(getHash(pass)))
        return true;
    return false;
}
于 2009-07-02T16:01:25.933 回答
2

使用 Jasypt 似乎没有特定于 Hibernate 的方法,但您可以在 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()。

于 2011-03-31T05:17:24.853 回答
2

如果您在应用程序中使用 Spring,那么您也可以使用Spring Security,它为您提供了几种密码编码器,即ShaPasswordEncoder 您可以在StackOverflow上找到它

于 2013-08-08T10:10:33.133 回答
0

我只是使用类似的东西SHA-256(username + ":" + password + ":" + salt)并将其存储在数据库中名为 passwd 的 64 个字符的列中。

维基百科说,与盐有关:“盐数据使使用字典条目预加密的字典攻击变得复杂:使用的每一位盐都会使所需的存储量和计算量增加一倍。......为了获得最佳安全性,盐值是保密的,与密码数据库分开。当数据库被盗时,这提供了一个优势,但盐不是。

因此,要进行身份验证,请使用提供的用户名从数据库中获取用户,然后使用通过登录尝试提供的密码生成相同的哈希,并与数据库中的密码进行比较。还为登录尝试添加一些速率限制(例如,每 5 分钟 5 次)。如果用户忘记了密码,切勿通过电子邮件向他们发送密码(因为您不会将其存储),也不要通过电子邮件向他们发送新生成的密码,而是通过电子邮件向他们发送链接以使用更改密码密钥/nonce/salt 更改密码您可以检查的 URL。

于 2009-07-02T15:50:06.447 回答