Нужно ли беспокоиться о времени атаки при сравнении хэшей SHA256 или Argon2? - PullRequest
0 голосов
/ 15 января 2019

Я реализовал алгоритм хэширования 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);
        }
    }
}
...