对于内部Tomcat / Java / Struts应用程序,我们将自定义编写的身份验证代码转换为使用JDBCRealm。数据库是MySQL 5.0,密码存储为PASSWORD()
- 加密字符串。在我们的MySQL版本中,PASSWORD()
function是一个非标准(专有?)41字节哈希。 (我现在知道我们不应该将它用于我们的密码,而应该使用SHA1()
或MD5()
。但我们在这里。)
有没有办法在不强迫所有用户重新输入密码的情况下使用JDBMRealm,以便重新编码?是否有JDBCRealm摘要,允许我们对PASSWORD()
编码的密码列进行身份验证?
答案 0 :(得分:1)
名为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()
进行身份验证的用户更改其密码。随着时间的推移,您希望能够切换到基于标准摘要的方法。