【问题标题】:Hashed and Salted Password is not always the same散列和加盐密码并不总是相同的
【发布时间】: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:看起来你是对的。我刚刚更新了我上面的帖子。看起来我的一段代码正在更改数据库中的密码,现在要追踪它。

标签: java hash salt shiro


【解决方案1】:

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

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

【讨论】:

  • 感谢您的提示,但我已经为每个用户使用了不同的盐。目前我正在跟踪我的查询以查看发生了什么。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-02-17
    • 2015-08-20
    • 2011-06-02
    • 2011-10-29
    • 2014-06-10
    • 2023-03-13
    • 2012-03-24
    • 2011-07-27
    相关资源
    最近更新 更多