对于内部Tomcat / Java / Struts应用程序,我们正在将自定义编写的身份验证代码转换为使用JDBCRealm。数据库是MySQL 5.0,密码存储为PASSWORD()加密的字符串。在我们的MySQL版本中,PASSWORD() function是一个非标准(专有的)41字节哈希。 (我现在知道我们不应该将其用作密码,而应该使用SHA1()MD5()。但是这里是。)

有什么方法可以使用JDBMRealm而不强迫我们所有的用户重新输入密码,以便我们对它们重新编码?是否存在JDBCRealm摘要,该摘要将允许我们针对PASSWORD()编码的密码列进行身份验证?

最佳答案

名为OLD_PASSWORD()的新MySQL版本provide a function可以以与4.0及更低版本向后兼容的方式提取密码。

因此,您可以按照以下方式对configure JDBCRealm进行操作:


本身不使用任何摘要。即使在安全环境中,这显然也不是理想的选择,而且如果您的数据库服务器位于不受信任的连接中,则完全是危险的。通过不指定digest属性来执行此操作。
在与数据库中的密码进行比较之前,使用上面的OLD_PASSWORD()函数对密码进行加密。您将必须扩展JDBCRealm,此功能不是开箱即用的。对于Tomcat 6.0,您必须重写authenticate(Connection c, String username, String credentials)方法。


您还可以将上述方法用作迁移策略的一部分:使覆盖的方法同时支持OLD_PASSWORD()和摘要,并强制使用OLD_PASSWORD()进行身份验证的用户更改密码。随着时间的流逝,您将有望切换到基于标准摘要的方法。

关于java - MySQL PASSWORD()函数的JDBCRealm摘要,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1244607/

10-13 00:40