4

現在の BCrypt の実装が正しいかどうかを知りたいのですがBCrypt.checkpw()、問題につながる可能性のある使用していないことを認識しているため、ここで確認する主な理由です。

Hasher.java コンテナ クラス:

abstract public class Hasher {
    public static String hash(final char[] input) {   
        String output = Hasher.hash(new String(input));
        for (int i = 0; i < input.length; i++) {
            input[i] = 0;
        }
        return output;
    }

    public static String hash(final String input) {
        return BCrypt.hashpw(input, BCrypt.gensalt());
    }
}

ここで 1 つの懸念事項:セキュリティ上の理由から、文字列のみを受け入れますJPasswordField。その文字列が私の記憶に浮かぶのを避けるにはどうすればよいですか?char[]BCrypt.hashpw()

ログインのクライアント実装:

String hashedPassword = Hasher.hash(password);
Network.getInstance().send("login " + username + " " + hashedPassword);

したがって、ハッシュはネットワーク経由で送信されます。現在、ネットワークは暗号化されていませんが、それを追加する予定です。

アカウント作成時のサーバー実装:

public static Account createAccount(final String username, final String password) {
    String hashedPassword = Hasher.hash(password.toCharArray());
    return new Account(username, hashedPassword);
}

パスワードチェックのサーバー実装:

public boolean checkPassword(final String hashedPassword) {
    return this.hashedPassword.equals(hashedPassword);
}

サーバーのメモリにthis.hashedPasswordあるハッシュ(起動時にデータベースから取得される)です。

私のセットアップのプロパティ:

  • パスワードはそこでハッシュ化されるため、クライアントのログインにはかなりの時間がかかります。
  • アカウントの作成/パスワードの変更には、パスワードがサーバー上でハッシュされるため、サーバーでかなりの時間がかかります。
  • ハッシュを行う必要がないため、サーバーはログイン試行の検証にほとんど時間がかかりません。
  • 誰かがハッシュを含むデータベースを手に入れた場合、アカウントごとにパスワードを解読するのにかなりの時間がかかります.
  • の適切な作業係数を把握する必要がありBCrypt.gensalt()ます。

私の仮定を確認してください。

よろしく。

4

1 に答える 1

11

このセットアップにはいくつかの問題があります。

1)ソルトは、ハッシュプロセス中にランダムに生成された値である必要があります(実装にあるようです。クライアントは保存されたハッシュのデータベースにアクセスできないため、クライアントは、ハッシュを作成するときにどのソルトを使用するかわかりません。ログインハッシュ。

2) この実装は、クライアントから渡されたパスワードを実際にチェックするのではなく、クライアントから渡されたパスワード ハッシュをチェックしています。つまり、誰かがハッシュのデータベースを取得した場合、そのハッシュをすぐに使用してログインできるということです。パスワードをチェックしないので、パスワードを抽出するためにクラックする必要はありません。

これらの問題は両方とも、すべてのハッシュ サーバー側を移動することで簡単に解決できます。

アップデート

あなたが言及した問題について。

1) 安全なシステムを作成する意図がある場合は、SSL/TLS を使用する必要があります。パスワード ハッシュを平文で送信することは、パスワードを平文で送信する場合とほぼ同じくらい安全ではありません。どちらもひどい考えです。HTTPS を使用します。

2) サーバー側のハッシュを実行することは、ごく普通のことです。ハッシュ プロセスは計算コストが高いため、徹底的な検索は実用的ではありませんが、認証ワークフローを妨げるべきではありません。DoS されていることを本当に懸念している場合は、特定のユーザーが過去 N 秒間にログインを試みた回数を追跡してください。一定回数失敗した場合は、アカウントをロックします。

于 2013-05-19T16:44:24.223 に答える