【发布时间】:2011-08-15 11:27:54
【问题描述】:
我在我的 Spring 应用程序中使用 Apache Shiro 作为我的安全层,我遇到了一个非常奇怪的情况。
首先,这就是我的安全系统的设置方式。当用户注册时,他们的密码会使用安全生成的随机盐进行散列。然后将盐和散列密码存储在我的数据库中。当他们注册和登录时,一切都 100% 正常工作,但几天过去了,突然他们的散列密码不再匹配。这是我的代码:
import org.apache.shiro.codec.Base64;
import org.apache.shiro.crypto.hash.Sha256Hash;
public static void main(String[] args) {
String plainPassword = "testing";
String salt = "8AFTpriREtydSg39+37rQHNRyvZLuXqyXYgWXI55f1PbhbUQSeFGCLKsHpA6thZKs3uQeNNJHksqcV5oaNcr9lQiXMMyC8Duqr2aQaqyjLKpNMVlB69jJ7emNq0K6ccfBdv/O4JGT2U689LeNg6CqN+9kqW2GBgT2CIVOlapA34=";
System.out.println(new Sha256Hash(plainPassword.toCharArray(), Base64.decode(salt), 1024).toBase64());
}
得到的哈希密码是:
b8VLt/eKV8F5kwDjRgdkM+PAvQC8sk7Ooflt91juaXA=
但是我在数据库中的密码是:
xZNBNlUa8vRQq0qY5bbkETzZtzztGRTH2KZKijQdilU=
所以你可以想象,我完全被难住了。有谁知道我做错了什么?或者,如果我离开了一步。
更新 1:在我的系统中注册新用户后,系统中的所有其他用户似乎都因某种原因更改了密码。所以这与密码哈希的生成方式无关,更多的是与我的数据库访问层有关。
【问题讨论】:
-
好吧,我们看不出你做错了什么,因为你没有告诉我们 :) 另一个密码不是用相同的过程生成的 OR 它被复制了有错误
-
用于生成存储在数据库中的密码的代码是否与上述代码相同?如果是,那么您必须更改了服务器上的 Shiro 版本,更改了存储在数据库中的密码,或者更改了服务器上的哈希码。
-
@Boarealid:看起来你是对的。我刚刚更新了我上面的帖子。看起来我的一段代码正在更改数据库中的密码,现在要追踪它。