1

我正在使用 Java 6、Jasypt 和 BouncyCastle 生成散列密码。我将它们存储在具有默认 UTF-8 字符编码的 MySQL 5.5 db 中。我试图弄清楚我使用 SHA-256 散列算法和 20 字节的 RandomSaltGenerator 应该给我的 VARCHAR 密码字段多长时间。这是我在 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>

感谢您的指导, - 戴夫

4

1 回答 1

1

不出所料,SHA-256 散列函数的输出长度为 256 位。生成的字符数取决于您如何对其进行编码。

一个直接的二进制编码,每字节 8 位,会给你 32 个字节,但是如果你将哈希输出存储在一个文本字段中,你可能会使用例如 Base64 对其进行编码(每个字符 6 位,填充为4 个字符,总共 44 个字符)或可能是十六进制(每个字符 4 位,总共 64 个字符)。

除了哈希之外,密码字段通常还包含重建它所需的盐。这将添加一些额外数量的字符,这取决于所选择的确切密码散列方案、输出编码和参数(例如您的saltSizeBytes)。

无论如何,如果您的密码散列方法的输出长度没有明确记录,那么找到它的最简单方法可能是只提供一些测试密码并查看它返回的内容。(通常,输出的长度应该是恒定的。)然后,如果您愿意,可以在数据库定义中添加一些边距以确保安全。

哦,正如 Waleed Khan 所说,您确实应该使用实现密钥拉伸的密码散列方法,例如PBKDF2

于 2013-01-05T01:49:15.387 回答