3

Spring アプリのセキュリティ レイヤーとして Apache Shiro を使用していますが、非常に奇妙な状況に遭遇しています。

まず、これが私のセキュリティシステムのセットアップ方法です。ユーザーが登録すると、パスワードは安全に生成されたランダム ソルトでハッシュされます。ソルトとハッシュ化されたパスワードは、DB に保存されます。登録するとすべてが 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 に答える