0

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

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

4

1 回答 1

1

新的 MySQL 版本提供了一个名为OLD_PASSWORD()以向后兼容 4.0 和更早版本的方式消化密码的函数。

因此,您可以做的是以如下方式配置 JDBCRealm

  1. 本身不使用任何类型的摘要。即使在安全的环境中,这显然也不理想,并且如果您的数据库服务器存在于不受信任的连接中,这将是非常危险的。您可以通过不指定digest属性来做到这一点。
  2. OLD_PASSWORD()在将密码与数据库中的密码进行比较之前,使用上述函数对密码进行加密。您必须扩展 JDBCRealm,此功能不是开箱即用的。对于 Tomcat 6.0,您必须覆盖authenticate(Connection c, String username, String credentials)方法。

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

于 2009-08-07T16:55:11.440 回答