MySQL PASSWORD() 函数的 JDBCRealm 摘要

发布于 2024-07-30 05:34:51 字数 515 浏览 12 评论 0原文

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

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

For an internal Tomcat/Java/Struts application, we're converting custom-written authentication code to use JDBCRealm. The database is MySQL 5.0, and the passwords are stored as PASSWORD()-encrypted strings. In our version of MySQL, the PASSWORD() function is a non-standard (proprietary?) 41-byte hash. (I know now that we shouldn't be using it for our passwords, but should instead be using SHA1() or MD5(). But here we are.)

Is there any way to use JDBMRealm without forcing all of our users to re-enter their passwords so we can re-encode them? Is there a JDBCRealm digest that will allow us to authenticate against a PASSWORD()-encoded password column?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

醉城メ夜风 2024-08-06 05:34:51

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

因此,您可以做的是配置 JDBCRealm这样它:

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

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

New MySQL versions provide a function called OLD_PASSWORD() that digests password in a way backwards-compatible with 4.0 and prior.

What you can do, therefore, is to configure JDBCRealm in such a way that it:

  1. Does not use any kind of digest by itself. This is obviously not ideal even in secure environment and is outright dangerous if your database server lives across untrusted connection. You do this by not specifying digest attribute.
  2. Uses the above OLD_PASSWORD() function to encrypt the password before comparing it with the one from the database. You will have to extend JDBCRealm, this functionality is not provided out of the box. For Tomcat 6.0 you'll have to override authenticate(Connection c, String username, String credentials) method.

You can also use the above approach as part of migration strategy: have the overridden method support both the OLD_PASSWORD() and digest and force users who've authenticated using OLD_PASSWORD() to change their password. With time you'll then hopefully be able to switch to standard digest-based approach.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文