哈希和加盐密码并不总是相同的。

3

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

首先,这是我的安全系统设置方式。当用户注册时,他们的密码将使用安全生成的随机盐进行哈希处理。然后将盐和哈希密码存储在我的数据库中。当他们注册并登录时,一切都正常运行,但是几天过去了,突然间他们的哈希密码不再匹配。以下是我的代码:

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 复制时出现了错误。 - sehe
2
生成密码的代码是否与上述代码完全相同并存储在数据库中?如果是,则您必须更改了服务器上的Shiro版本,更改了存储在数据库中的密码或更改了服务器上的哈希代码。 - Borealid
@Boarealid:看起来你是对的。我刚刚更新了我的帖子。似乎我的代码中有一部分正在更改数据库中的密码,现在需要找出它。 - Michael Gaylord
2个回答

1

看起来你的问题与哈希和盐无关。你正在发送不正确的查询,更新了不需要的记录。

但我会给你一个有关盐的建议 - 为每个用户使用不同的盐。否则你的密码就不够安全了。想象一下,如果有人获得了盐和你的数据库,过一段时间(可能是几周,但并不多),他就能生成彩虹表并获取大部分密码。而如果你使用不同的盐,他将不得不为你的每个用户生成许多彩虹表。


感谢您的提示,但我已经为每个用户使用了不同的盐。目前,我正在跟踪我的查询以查明情况。 - Michael Gaylord

0
原来我在别的地方有一些可疑的代码,它更新了我的用户对象并用新密码覆盖了他们的密码。所以密码哈希算法其实是没问题的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接