Я хотел бы знать, правильна ли моя текущая реализация BCrypt, я знаю, что я не использую BCrypt.checkpw()
, что может привести к проблеме, так что это основная причина, по которой я проверяю ее здесь.Java: Является ли это хорошим использованием BCrypt?
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());
}
}
Одна из проблем здесь: JPasswordField
дает мне char[]
по соображениям безопасности, однако BCrypt.hashpw()
принимает только строки. Как я могу избежать того, чтобы String плавала в моей памяти?
Реализация клиент входа в систему:
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
является хэш, который находится в памяти сервера (который поступает из базы данных по Bootup).
Свойства моей установки:
- Вход в занимает значительное время клиента, так как пароль хешируется там.
- Создание учетной записи/Изменение пароля занимает значительное время сервера, так как тогда пароль хешируется на сервере.
- Проверка попыток входа в систему берет сервер практически без какого-либо времени, так как не требуется никакого хеширования.
- Если кто-то доставит базу данных, содержащую хеши, то потребуется значительное время, чтобы взломать пароль для каждой учетной записи.
- Мне все еще нужно найти хороший коэффициент работы для
BCrypt.gensalt()
.
Пожалуйста, проверьте мои предположения.
С уважением.
Чтобы проверить предоставленный пароль, вам необходимо записать его с той же солью, что и сохраненный. – Gumbo
Соль хранится внутри «хэша» (хэш хэширования на самом деле больше, чем просто хеш), разве это не покрыло бы часть проверки? – skiwi
Выполнение хэширования для клиентской стороны аутентификации, как правило, является плохой идеей. Во-первых, если кто-то справится с вашей хэш-базой данных, они могут войти в систему как кто угодно, даже если они еще не взломали пароли. Кроме того, поскольку солоны генерируются случайным образом во время процесса хэширования, ваш логин никогда не будет выдавать один и тот же хэш дважды и, следовательно, никогда не будет соответствовать хешу на стороне сервера. – Aurand