对于内部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/