gpt4 book ai didi

java - 使用 bcrypt 编写自定义 tomcat 领域

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:14 25 4
gpt4 key购买 nike

我正在开发一个基于 Java 的 Web 应用程序,使用 Tomcat 7.0 作为应用程序服务器。在对 a prior question 的有用回复之后,我决定使用 bcrypt 将密码安全地存储在我的 HSQLDB 中。然而,Tomcat 的默认 Realm 实现无法处理 bcrypt,所以我需要自己编写;这是我编写自定义领域的唯一原因,尽管在所有其他方式中,普通 JDBCRealm 都可以工作。我一直在谷歌搜索和查看示例,但我对几点感到很困惑。

首先,我应该扩展 RealmBase 还是 JDBCRealm?我发现的大多数示例都使用 RealmBase,但到目前为止,我已经成功地将 JDBCRealm 用于该应用程序(因为它仍在开发中,所以我开始以明文形式存储密码并仅使用 JDBCRealm 来处理身份验证),以及一个答案一个question on Code Ranch建议只是扩展它。不过,我不确定在那种情况下我需要重写哪些方法。只是身份验证方法,还是更多?如果这样做,JDBCRealm 仍然能够处理和管理用户角色、getPrincipal 等等吗?

其次,在上面链接的 CodeRanch 示例中,除非我遗漏了什么,否则 getPassword 方法似乎返回未加密的密码。因为我将使用不可能的 bcrypt,而且它似乎有点不可取,我想。在其他类似的例子中 blog post , getPassword 好像只是直接从数据库返回密码而已。那么哪种方式是正确的呢?我找不到 getPassword 的确切用途;文档没有说。只返回存储在数据库中的加密值就可以了吗?

如果有人能告诉我应该扩展什么类、应该覆盖哪些方法以及应该返回什么 getPassword,我将不胜感激。

最佳答案

好吧,经过反复试验,我想出了如何做到这一点。我扩展了 JDBCRealm 并且只覆盖了身份验证方法并且它工作得很好。我把BCrypt.java在与我的自定义领域相同的目录中,这段代码有效:

import java.security.Principal;
import org.apache.catalina.realm.JDBCRealm;
public class BCryptRealm extends JDBCRealm
{
@Override
public Principal authenticate(String username, String credentials)
{
String hashedPassword = getPassword(username);
// Added this check after discovering checkpw generates a null pointer
// error if the hashedPassword is null, which happens when the user doesn't
// exist. I'm assuming returning null immediately would be bad practice as
// it would let an attacker know which users do and don't exist, so I added
// a call to hashpw. No idea if that completely solves the problem, so if
// your application has more stringent security needs this should be
// investigated further.
if (hashedPassword == null)
{
BCrypt.hashpw("fakePassword", BCrypt.gensalt());
return null;
}
if (BCrypt.checkpw(credentials, hashedPassword))
{
return getPrincipal(username);
}
return null;
}
}

关于java - 使用 bcrypt 编写自定义 tomcat 领域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12285604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com