我正在使用带有JDK 1.8.0_25的Tomcat8.0.17。我使用Derby作为数据库。
我有一个使用SHA-256摘要的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似乎可以很好地处理摘要工具输出(包括美元符号)。
发布于 2015-11-24 10:06:57
消化器的结果以以下格式显示:
摘要密码:salt$iterations$
例如,密码"1234",20个字符的盐和10次迭代将产生:
1234:d83beb29c66cd2f021a469875ffd4c608c25d855$10$eab99fbeedfd7d01b94cd3cf8484a99ad671726faa3e5d48c0699b489aa35658
发布于 2015-01-17 07:56:04
我刚刚测试了它,我猜Tomcat只是从摘要工具输出中去掉了直到第二个美元符号的所有东西。因此,我可以使用Apache Commons在Java中生成SHA-256散列十六进制字符串:
String sha256hex = org.apache.commons.codec.digest.DigestUtils.sha256Hex(password);
编辑:那么,摘要工具生成的散列字符串中的“$”符号的意义是什么?我猜是和盐有关吧?
https://stackoverflow.com/questions/27994444
复制相似问题