在使用Spring和Hibernate(JPA)的数据访问层在Java应用程序堆栈,什么是应用(希望使用注释)的密码加密的好方法,你在哪里可以找到更多关于得非常好(教程等)?
它的了解,我会用一个JCA支持的算法来加密密码,但我宁愿没有实现包装的逻辑,如果有一个简单的方法。
我看着Jasypt,并且是)想知道,这是一个很好的选择,以及如何做到这一点和b)还有什么人都在使用这一点。 如果有人使用Jasypt或替代,你的经验细节将是巨大的。
在使用Spring和Hibernate(JPA)的数据访问层在Java应用程序堆栈,什么是应用(希望使用注释)的密码加密的好方法,你在哪里可以找到更多关于得非常好(教程等)?
它的了解,我会用一个JCA支持的算法来加密密码,但我宁愿没有实现包装的逻辑,如果有一个简单的方法。
我看着Jasypt,并且是)想知道,这是一个很好的选择,以及如何做到这一点和b)还有什么人都在使用这一点。 如果有人使用Jasypt或替代,你的经验细节将是巨大的。
Java有都已经为您提供了所需的库。 简单地创建一个实用方法如在描述实现与盐散列OWASP 。
如果你真的不希望自己的代码,不介意额外的依赖,似乎四郎图书馆(原JSecurity )具有实现什么是OWASP所描述的。
它也像你提到的JASYPT库有一个类似的工具 。
我知道这个答案没有提到春天或休眠,但我不清楚你是怎么想借助他们在这种情况下。
您可以使用Jasypt与Hibernate在飞行中进行加密或散列你的属性,如果这是你在找什么。 用于计算摘要(哈希值)的实际的算法,如果你想推出自己以及使用JCE是非常简单的。
MD5或SHA-256就可以了,虽然MD5是现在攻破。
也许我误解的问题,但它应该只是比较散列密码。
在Hibernate中,只存储为一个字符串。 在验证方面,有这样的方法:
public validate(String user, String pass)
{
if(getUser(user).getPass().equals(getHash(pass)))
return true;
return false;
}
似乎没有要与Jasypt做一个Hibernate的具体方式,但你可以设置在春季密码加密:
<!--
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,那么你也可以使用Spring Security的 ,它为您提供了几个密码编码器,即ShaPasswordEncoder你可以找到它的StackOverflow
我只是用类似的东西SHA-256(username + ":" + password + ":" + salt)
,并将其存储在数据库中称为passwd的64字符列。
维基说,涉及盐:“盐的数据使用字典条目的预加密字典攻击的复杂化:使用盐的每一位双打存储和计算所需的量......为了获得最佳的安全性,盐值是保密的,从密码数据库分开。这提供了一个优点,当一个数据库被盗,但该盐是不“。
因此,要进行身份验证,从提供的用户名数据库获得用户,然后生成通过使用其登录尝试提供的密码相同的散列,并比较在数据库中。 此外,在某些速率限制的登录尝试(例如,每5 5分钟的时间)添加。 如果用户忘记了自己的密码,千万不要给他们发电子邮件的密码(如你将它存储没有),也没有给他们发邮件新生成的密码,而是给他们发邮件的链接以更改密码键/现时/盐更改密码你可以核对网址。