mysql - 如何使用 bcrypt 配置 DataSourceRealm
问题描述
我正在寻找一些技巧,如何使用 MySQL 数据库配置 DataSourceRealm,包括 bcrypt-hashed 密码。不幸的是,我已经在努力让 DataSource 运行——即使使用明文密码也是如此。
我已经编辑了 conf/context.xml 并添加了 DataSource,如下所示:
<Context>
[...]
<Resource name="jdbc/MYRESOURCE" auth="Container" type="javax.sql.DataSource"
maxTotal="100" maxIdle="30" maxWaitMillis="10000"
username="USER" password="PASSWORD" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://my.database.com:3306/DATABASE?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&verifyServerCertificate=false&useSSL=true&requireSSL=true&autoReconnect=true" />
</Context>
server.xml 包含的领域如下:
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/MYRESOURCE"
userTable="myuser" userNameCol="username" userCredCol="password"
userRoleTable="myuser_roles" roleNameCol="role"/>
当我启动 Tomcat 时,它说找不到我的上下文“jdbc/MYRESOURCE”。
我还尝试在 conf/context.xml 中添加另一个,这导致 Tomcat 根本没有启动。同样,如果我将 conf/server.xml 添加到
这里有什么问题?有人可以帮忙吗?
解决方案
关于明文部分,您<Resource>
在 webapp 上下文中声明 JDBC,因此:
<Realm>
在与 a 相同的上下文localDataSource="true"
中声明Resource
或在内部全局声明 JDBC<GlobalNamingResources>
。
关于bcrypt:Tomcat (MessageDigestCredentialHandler
和SecretKeyCredentialHandler
) 中的两个凭证处理程序都不支持 bcrypt 使用的格式或密码散列。如果您想重用来自其他来源的散列密码,则必须编写自己的CredentialHandler
.
唯一支持的存储格式是:
plainText
- 如果未指定算法,则为纯文本凭据encodedCredential
- 使用配置的摘要摘要的密码的十六进制编码摘要{MD5}encodedCredential
- 密码的 Base64 编码 MD5 摘要{SHA}encodedCredential
- 密码的 Base64 编码 SHA1 摘要{SSHA}encodedCredential
- 20 个字符加盐,后跟加盐 SHA1 摘要 Base64 编码salt$iterationCount$encodedCredential
- 一个十六进制编码的盐、迭代代码和一个十六进制编码的凭证,每个都用 $ 分隔
(源Tomcat 文档)
但是支持的散列函数类似于 bcrypt,因此您可以使用,例如:
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/MYRESOURCE"
userTable="myuser"
userNameCol="username"
userCredCol="password"
userRoleTable="myuser_roles"
roleNameCol="role">
<CredentialHandler class="org.apache.catalina.realm.SecretKeyCredentialHandler" />
</Realm>
并具有与 bcrypt 一样安全的格式。
您可以使用以下方法对密码进行哈希处理:
$CATALINA_HOME/bin/digest.sh -h org.apache.catalina.realm.SecretKeyCredentialHandler <your_password>
从命令行,$CATALINA_HOME
Tomcat的目录在哪里。
推荐阅读
- java - 为什么 java 中的 Arrays.sort() 方法不使用计数排序技术?
- javascript - 一次通话两种不同的内容类型
- google-apps-script - 如何将谷歌文档转换为干净的 HTML
- apache-kafka - 如何自动调用 kafka-stream-processor 中的 process() 方法?
- java - 由动画关键帧引起的除零异常 (LIBGDX)
- angular - 数组更改时刷新 ng2-smart-table
- python - 将多个值添加到列中 - Pandas
- ios - 从我的本机应用程序将 cookie 传递给 SFSafariViewController
- html - Dreamweaver 不加载缓存克星 css
- python - Python将var初始化为None?