現在の 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()
ます。
私の仮定を確認してください。
よろしく。