编写Java EE 6应用程序我需要一些帮助,使用带有md5哈希的DatabaseServerLoginModule。
设定:
登录-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>
的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
写的都是一样的。
使用on身份验证方法,根本不使用md5哈希并使用表单而不是摘要配置工作。有什么想法吗?
提前致谢
答案 0 :(得分:1)
md5哈希现在被认为是不安全的。它在很多方面被打破了。
更好地使用SHA。
答案 1 :(得分:1)
查看MessageDigest
课程:
http://download.oracle.com/javase/1.4.2/docs/api/java/security/MessageDigest.html
不要使用MD5。使用类似SHA-256的东西,并迭代地对字符串进行散列并在第一个散列之前添加salt。散列函数不是为密码加密而设计的。
答案 2 :(得分:1)
nogamawa,SHA算法的目的与MD5类似,它是单向加密,即无法解密消息。 SHA2被证明更强大。 Java Cryptographic Extentions(JCE)支持算法。 --kiran.kumar
答案 3 :(得分:1)
超越MD5与SHA2(这是一个好主意),为每个密码添加随机生成的盐实际上更重要。它建议每个密码至少有128位随机生成的盐。这可以防止Rainbow表攻击(一种预先计算的密码哈希值)。
您还应该多次迭代哈希算法,并将每个哈希的结果提供给它。哈希算法被设计为快速,这意味着攻击者只需一台廉价的个人计算机和显卡就可以计算出数百万或数十亿的哈希值。建议最多进行25,000次哈希算法迭代,将输出放回输入。在现代CPU上,这需要不到一秒钟。如果你这样做,它会破解密码,这在计算上更加困难。