MySQL PASSWORD()函数的JDBCRealm摘要

时间:2009-08-07 13:07:34

标签: java mysql passwords digest jdbcrealm

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

有没有办法在不强迫所有用户重新输入密码的情况下使用JDBMRealm,以便重新编码?是否有JDBCRealm摘要,允许我们对PASSWORD()编码的密码列进行身份验证?

1 个答案:

答案 0 :(得分:1)

名为OLD_PASSWORD()的新MySQL版本provide a function以向后兼容4.0及之前的方式消化密码。

因此,你可以做到configure JDBCRealm以这样的方式:

  1. 本身不使用任何形式的摘要。即使在安全的环境中,这显然也不理想,如果数据库服务器存在于不受信任的连接中,则完全是危险的。您可以通过不指定digest属性来执行此操作。
  2. 使用上述OLD_PASSWORD()函数加密密码,然后将其与数据库中的密码进行比较。您必须扩展JDBCRealm,此功能不是开箱即用的。对于Tomcat 6.0,您必须覆盖authenticate(Connection c, String username, String credentials)方法。
  3. 您还可以将上述方法用作迁移策略的一部分:让重写的方法同时支持OLD_PASSWORD()和摘要,并强制使用OLD_PASSWORD()进行身份验证的用户更改其密码。随着时间的推移,您希望能够切换到基于标准摘要的方法。