【问题标题】:How to use md5 hashing in Jboss 6 for JAAS WebAuthentication?如何在 Jboss 6 中使用 md5 散列进行 JAAS WebAuthentication?
【发布时间】:2011-02-24 09:08:05
【问题描述】:

编写一个 Java EE 6 应用程序我需要一些帮助,使用带有 md5 散列的 DatabaseServerLoginModule。

设置:

登录配置.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>

web.xml:

<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 生成器检查了写入数据库的值,例如 http://www.miraclesalad.com/webtools/md5.php

写的都一样。

使用完全没有 md5 散列且使用表单而不是摘要配置的身份验证方法。有什么想法吗?

提前致谢

【问题讨论】:

    标签: java security jboss md5 jaas


    【解决方案1】:

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

    更好地使用 SHA。

    【讨论】:

    • 你能给我举个例子吗?
    • @nogamawa - 我不是在 Java 上编码,所以我无法帮助你编写代码:)。但是here 你可以看到 DigestUtils 类的定义。您可以根据需要使用sha256、sha384或sha512。
    【解决方案2】:

    看看MessageDigest类:

    http://download.oracle.com/javase/1.4.2/docs/api/java/security/MessageDigest.html

    不要使用 MD5。改用 SHA-256 之类的东西,并迭代地散列字符串并在第一个散列之前添加盐。散列函数不是为密码加密而设计的。

    【讨论】:

    • 这是否意味着我不应该使用 DatabaseServerLoginModule 的散列功能,而是在我的代码中加密密码,然后将其传递给 WebAuthentication?
    【解决方案3】:

    nogamawa,SHA算法的目的类似于MD5,它是一种方式加密,即没有办法解密消息。 SHA2 被证明要强大得多。 Java 加密扩展 (JCE) 支持这两种算法。 --kiran.kumar

    【讨论】:

      【解决方案4】:

      除了 MD5 与 SHA2(这是一个好主意)之外,向每个密码添加随机生成的盐实际上要重要得多。建议每个密码至少使用 128 位随机生成的盐。这可以防止 Rainbow 表攻击(一种预先计算的密码散列形式)。

      您还应该多次迭代您的哈希算法,将每个哈希的结果提供给它。哈希算法被设计为 FAST,这意味着攻击者可以仅使用廉价的个人计算机和显卡每秒计算数百万或数十亿次哈希。建议进行 25,000 次以上的哈希算法迭代,将输出放回输入。在现代 CPU 上,这需要不到一秒钟的时间。如果你这样做,破解密码的计算难度就会大得多。

      【讨论】:

      • 实际上,加密的第一条规则是你永远不应该实现自己的加密,除非你想被黑客入侵。当前密码散列的黄金标准似乎是bcrypt,所以我会接受。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      相关资源
      最近更新 更多