使用Spring / Hibernate进行密码加密 - Jasypt还是其他什么?

时间:2009-07-02 15:39:42

标签: java hibernate jpa password-encryption jasypt

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

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

我正在看Jasypt,并且a)想知道这是一个不错的选择以及如何做到这一点b)其他人正在使用它。如果有人使用Jasypt或替代方案,那么您的体验细节就会很棒。

6 个答案:

答案 0 :(得分:7)

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

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

您提到的JASYPT库看起来也像similar utility

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

答案 1 :(得分:5)

如果您正在寻找的内容,可以使用Jasypt with Hibernate动态加密或哈希您的属性。如果你想自己推出自己的算法,使用JCE计算摘要(哈希)的实际算法非常简单。

答案 2 :(得分:2)

MD5或SHA-256可以,但MD5现在可以破解了。

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

在hibernate中,只需存储为String。在验证方面,有一个方法,如:

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

答案 3 :(得分: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()。

答案 4 :(得分:2)

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

上找到它

答案 5 :(得分:0)

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

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

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