Java 如何在JBoss6中使用md5哈希进行JAAS WebAuthentication?

Java 如何在JBoss6中使用md5哈希进行JAAS WebAuthentication?,java,security,jboss,md5,jaas,Java,Security,Jboss,Md5,Jaas,编写JavaEE6应用程序时,我需要一些使用带有md5哈希的DatabaseServerLoginModule的帮助 设置: login config.xml: <application-policy name = "app"> <authentication> <login-module code = "org.jboss.security.auth.spi.DatabaseServerLoginModule" flag = "requi

编写JavaEE6应用程序时,我需要一些使用带有md5哈希的DatabaseServerLoginModule的帮助

设置:

login config.xml:

 <application-policy name = "app">
      <authentication>
      <login-module code = "org.jboss.security.auth.spi.DatabaseServerLoginModule" flag = "required">
        <module-option name = "dsJndiName">java:/MySQLDS</module-option>
        <module-option name = "principalsQuery">Select password from user where email_current=?</module-option>
        <module-option name="rolesQuery">
            SELECT r.name, 'Roles' FROM role r, user_2_role ur, user u WHERE
            u.email_current=? AND u.id_user=ur.id_user AND ur.id_role=r.id_role
        </module-option> 
        <module-option name ="hashAlgorithm">md5</module-option>
        <module-option name="hashEncoding">base64</module-option>
        <module-option name="ignorePasswordCase">false</module-option>
        <module-option name="hashStorePassword">false</module-option>
        <module-option name="hashUserPassword">true</module-option>
     </login-module>
     <!-- login-module code="org.jboss.security.ClientLoginModule" flag="required" /-->
     </authentication>
 </application-policy>
<security-constraint>
    <web-resource-collection>
        <web-resource-name>Customer Content</web-resource-name>
        <url-pattern>/customer/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>AuthorizedUser</role-name>
        <role-name>customer</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>
<login-config>
    <auth-method>DIGEST</auth-method>
    <realm-name>The Restricted Zone</realm-name>
    <form-login-config>
        <form-login-page>/login.html</form-login-page>
        <form-error-page>/login.html</form-error-page>
    </form-login-config>
</login-config>
<security-role>
    <description>The role required to access restricted content </description>
    <role-name>customer</role-name>
</security-role>
// login
WebAuthentication pwl = new WebAuthentication();
if (pwl.login(aEmail, aPassword)) {
    return "customer/dashboard?faces-redirect=true";
} else {
    throw new IncorrectCredentialsException();
}
final byte[] md5Hash = DigestUtils.md5(newPassword);
md5NewPassword = Hex.encodeHexString(md5Hash);
我使用以下实现存储密码:

 <application-policy name = "app">
      <authentication>
      <login-module code = "org.jboss.security.auth.spi.DatabaseServerLoginModule" flag = "required">
        <module-option name = "dsJndiName">java:/MySQLDS</module-option>
        <module-option name = "principalsQuery">Select password from user where email_current=?</module-option>
        <module-option name="rolesQuery">
            SELECT r.name, 'Roles' FROM role r, user_2_role ur, user u WHERE
            u.email_current=? AND u.id_user=ur.id_user AND ur.id_role=r.id_role
        </module-option> 
        <module-option name ="hashAlgorithm">md5</module-option>
        <module-option name="hashEncoding">base64</module-option>
        <module-option name="ignorePasswordCase">false</module-option>
        <module-option name="hashStorePassword">false</module-option>
        <module-option name="hashUserPassword">true</module-option>
     </login-module>
     <!-- login-module code="org.jboss.security.ClientLoginModule" flag="required" /-->
     </authentication>
 </application-policy>
<security-constraint>
    <web-resource-collection>
        <web-resource-name>Customer Content</web-resource-name>
        <url-pattern>/customer/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>AuthorizedUser</role-name>
        <role-name>customer</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>
<login-config>
    <auth-method>DIGEST</auth-method>
    <realm-name>The Restricted Zone</realm-name>
    <form-login-config>
        <form-login-page>/login.html</form-login-page>
        <form-error-page>/login.html</form-error-page>
    </form-login-config>
</login-config>
<security-role>
    <description>The role required to access restricted content </description>
    <role-name>customer</role-name>
</security-role>
// login
WebAuthentication pwl = new WebAuthentication();
if (pwl.login(aEmail, aPassword)) {
    return "customer/dashboard?faces-redirect=true";
} else {
    throw new IncorrectCredentialsException();
}
final byte[] md5Hash = DigestUtils.md5(newPassword);
md5NewPassword = Hex.encodeHexString(md5Hash);
我用一些来自互联网的md5生成器检查了写入数据库的值

他们写的都一样

使用完全不使用md5散列的OnAuthentication方法,并且使用form而不是digest配置的方法是可行的。有什么想法吗


提前感谢

md5哈希现在被认为是不安全的。它在很多方面都被破坏了


更好地使用SHA。

md5哈希现在被认为是不安全的。它在很多方面都被破坏了


更好地使用SHA。

查看
MessageDigest
类:


不要使用MD5。改为使用类似SHA-256的内容,并对字符串进行迭代散列,并在第一次散列之前添加盐。哈希函数不是为密码加密而设计的。

请查看
MessageDigest
类:


不要使用MD5。改为使用类似SHA-256的内容,并对字符串进行迭代散列,并在第一次散列之前添加盐。散列函数不是为密码加密而设计的。

nogamawa,SHA算法的用途类似于MD5,它是单向加密,即无法解密消息。SHA2被证明更强大。Java加密扩展(JCE)支持这两种算法。
--kiran.kumar

nogamawa,SHA算法的用途类似于MD5,它是单向加密,即无法解密消息。SHA2被证明更强大。Java加密扩展(JCE)支持这两种算法。 --kiran.kumar

除了MD5和SHA2(这是一个好主意)之外,实际上更重要的是在每个密码中添加一个随机生成的salt。建议每个密码至少有128位随机生成的salt。这可以防止彩虹表攻击(一种预先计算的密码散列形式)

您还应该多次迭代哈希算法,并将每个哈希的结果提供给它。散列算法设计得很快,这意味着攻击者只需一台廉价的个人计算机和图形卡,就可以每秒计算数百万或数十亿个散列。建议对哈希算法进行25000次以上的迭代,将输出返回到输入中。在现代CPU上,这只需不到一秒钟的时间。如果你这样做,破解密码在计算上会变得更加困难。

除了MD5和SHA2(这是个好主意)之外,在每个密码中添加一个随机生成的salt实际上更重要。建议每个密码至少有128位随机生成的salt。这可以防止彩虹表攻击(一种预先计算的密码散列形式)


您还应该多次迭代哈希算法,并将每个哈希的结果提供给它。散列算法设计得很快,这意味着攻击者只需一台廉价的个人计算机和图形卡,就可以每秒计算数百万或数十亿个散列。建议对哈希算法进行25000次以上的迭代,将输出返回到输入中。在现代CPU上,这只需不到一秒钟的时间。如果你这样做,破解密码的计算难度就会大得多。

你能给我一些实现的例子吗?@nogamawa-我不是在java上编写代码,所以我无法帮助你编写代码:)。但您可以看到DigestUtils类定义。您可以根据需要使用sha256、sha384或SH512。您能给我一些实现的例子吗?@nogamawa-我不是在java上编码,所以我无法帮助您编写代码:)。但您可以看到DigestUtils类定义。您可以使用sha256,sha384或sha512。这是否意味着我不应该使用DatabaseServerLoginModule的哈希功能,而是应该在我的代码中加密密码,然后将其传递给WebAuthentication?这是否意味着我不应该使用DatabaseServerLoginModule的哈希功能,而是应该在我的代码中加密密码,然后将它传递给WebAuthentication?实际上,加密的第一条规则是,除非你想被黑客攻击,否则你永远不应该实现自己的加密。目前密码哈希的黄金标准似乎是,所以我同意。事实上,加密的第一条规则是,除非你想被黑客攻击,否则你永远不应该实现你自己的加密。目前密码散列的黄金标准似乎是,所以我同意。