Нужно ли беспокоиться о времени атаки при сравнении хэшей SHA256 или Argon2?
Я реализовал алгоритм хэширования Argon2 для хэширования паролей. Я беспокоюсь о своем коде, он может быть уязвим для временной атаки.
public static boolean login(String mailId, String password) {
List<UserBean> userList = findByMailId(mailId);
if (userList == null || userList.isEmpty()) {
LOGGER.info("user not found");
return false;
} else {
UserBean user = userList.get(0);
if (PasswordEncoder.matches(password.toCharArray(),
user.getPassword())) {
LOGGER.info("password matched");
SessionUtils.setUserId("" + user.getId());
SessionUtils.setRole(user.getRole());
return true;
} else {
LOGGER.warn("Password incorrect for : " + user.getEmail());
return false;
}
}
если пользователь не найден, то время ответа меньше, чем время успеха.
PasswordEncoder.class
public class PasswordEncoder {
private static final Argon2 ARGON2 = Argon2Factory.create();
private static final int MEMORY = 65536;
private static final long MAX_MILLI_SECS = 1000;
private static final int PARALLELISM = 4;
private static final int ITERATIONS = Argon2Helper.findIterations(ARGON2,
MAX_MILLI_SECS, MEMORY, PARALLELISM);
public static String encode(char[] rawPassword) {
try {
return ARGON2.hash(ITERATIONS, MEMORY, PARALLELISM, rawPassword);
} finally {
ARGON2.wipeArray(rawPassword);
}
}
public static boolean matches(char[] rawPassword, String encodedPassword) {
try {
return ARGON2.verify(encodedPassword, rawPassword);
} finally {
ARGON2.wipeArray(rawPassword);
}
}
}