【发布时间】:2015-03-15 16:14:32
【问题描述】:
我正在使用 Tomcat 8.0.17 和 JDK 1.8.0_25。我正在使用 Derby 作为数据库。
我有一个使用 SHA-256 摘要的 FORM 身份验证的 DataSourceRealm。
我的 $WEBAPP/META-INF/context.xml 看起来像这样:
<Context>
<ResourceLink global="jdbc/demo" name="jdbc/demo" type="javax.sql.DataSource" />
<Realm className="org.apache.catalina.realm.DataSourceRealm"
digest="SHA-256"
dataSourceName="jdbc/demo"
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>
</Context>
使用 Tomcat 附带的摘要工具时,我可以使用摘要工具的输出手动更新数据库中的 users.user_pass 列,并且一切正常(注意 -s 0,因为 Tomcat 不适用于加盐哈希):
C:\>"%CATALINA_HOME%\bin\digest" -a SHA-256 -s 0 hotdog
hotdog:$1$35602208e86ac7d6b3a63780a9538a9d1763a646d5b9f3930a0548e0983e0ca6
...
ij> update users set user_pass='$1$35602208e86ac7d6b3a63780a9538a9d1763a646d5b9f3930a0548e0983e0ca6' where user_name='demouser';
1 row inserted/updated/deleted
现在我可以成功登录了。
现在我如何以编程方式(在 Java 中)生成 SHA-256 散列密码以插入数据库?我见过很多生成 SHA-256 哈希并将字节字符串转换为十六进制的示例。但是让我失望的部分是使用摘要工具时哈希的开头。它总是在开头生成带有“$”的哈希。当以编程方式转换哈希并以十六进制编码时,输出中永远不会包含“$”字符(因为十六进制中没有“$”,只有 0-F)。但 Tomcat 似乎与摘要工具输出(包括美元符号)配合得很好。
【问题讨论】:
标签: tomcat datasource sha256 jdbcrealm