哈希和盐渍密码并不总是一样的

时间:2011-04-29 12:28:04

标签: java hash salt shiro

我在Spring应用程序中使用Apache Shiro作为我的安全层,我遇到了一个非常奇怪的情况。

首先,这就是我的安全系统的设置方式。当用户注册他们的密码时,使用安全生成的随机盐进行哈希处理。然后将salt和哈希密码存储在我的数据库中。当他们注册并且登录工作也很好时,一切都可以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:在我的系统中注册新用户后,看起来系统中的所有其他用户由于某种原因更改了密码。因此,这与生成密码哈希的方式无关,而与我的数据库访问层有关。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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