3

我在我的 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:在我的系统中注册新用户后,系统中的所有其他用户似乎都因某种原因更改了密码。所以这与密码哈希的生成方式无关,更多的是与我的数据库访问层有关。

4

2 回答 2

1

看来您的问题与散列和加盐无关。您正在发送更新不需要的记录的不正确查询。

但我会提出一个关于加盐的建议——为每个用户使用不同的盐。否则你的密码就没有那么安全了。想象一下如果有人获得了盐和您的数据库会发生什么。过一段时间(可能是几周,但没那么多),他将能够生成一个彩虹表并拥有您的大部分密码。而如果您使用不同的盐,他将不得不生成与您的用户数量一样多的彩虹表。

于 2011-04-29T12:56:40.923 回答
0

事实证明,我在其他地方有一些狡猾的代码正在更新我的用户对象并用新密码覆盖他们的密码。所以密码哈希算法毕竟工作正常。

于 2011-04-29T14:32:40.390 回答