我正在使用Java 6,Jasypt和BouncyCastle来生成散列密码。我将它们存储在具有默认UTF-8字符编码的MySQL 5.5 db中。我正在试图弄清楚我的VARCHAR密码字段需要多长时间才能使用SHA-256哈希算法和20字节的RandomSaltGenerator。这是我在Spring应用程序上下文中的声明:
<beans:bean id="bcProvider" class="org.bouncycastle.jce.provider.BouncyCastleProvider" />
<beans:bean id="jasyptStringDigester" class="org.jasypt.digest.StandardStringDigester">
<beans:property name="algorithm">
<beans:value>SHA-256</beans:value>
</beans:property>
<beans:property name="provider">
<beans:ref bean="bcProvider" />
</beans:property>
<beans:property name="saltGenerator">
<beans:ref bean="saltGenerator" />
</beans:property>
<beans:property name="saltSizeBytes" value="20" />
</beans:bean>
感谢任何指导, - 戴夫
答案 0 :(得分:1)
SHA-256散列函数的输出可能不出所料,长256位。创建的字符数取决于您对其进行编码的方式。
直接二进制编码,每字节8位,可以给你32个字节,但是如果你将哈希输出存储在文本字段中,你可能正在使用例如Base64(每个字符6位,填充为4个字符的倍数,总共44个字符)或者可能是十六进制(每个字符4位,总共64个字符)。
除了哈希之外,密码字段通常还包含重构它所需的盐。这将添加一些额外的字符数,这将取决于所选的确切密码哈希方案,输出编码和参数(例如您的saltSizeBytes
)。
无论如何,如果没有明确记录密码哈希方法的输出长度,找到它的最简单方法可能是只提供一些测试密码并查看它返回的内容。 (通常,输出应该是恒定长度。)然后,如果需要,在数据库定义中添加一些余量以确保。
哦,正如Waleed Khan所说,你真的应该使用实现key stretching的密码散列方法,例如PBKDF2。