В большинстве распространенных приложений, которые мы разрабатываем, нам часто нужно хранить пользователя в базе данных, чтобы он мог позже войти в систему и выполнить некоторые действия.

Для этого мы часто хэшируем пароль пользователя перед его сохранением в базе данных. Это хорошая практика. Но знаете ли вы, какой алгоритм хеширования лучше всего использовать?

Существует несколько алгоритмов хеширования (MD5, SHA1, SHA256, Bcrypt..), но не все из них подходят для использования в настоящее время.

Забудьте об алгоритме хеширования MD5, потому что сегодня он считается небезопасным.

Проблема с MD5

Основной проблемой MD5 является высокая вероятность коллизии сообщений. Это может привести к дублированию хешированных сообщений.
MD5 также имеет ограниченный размер в 128 бит; из-за этого его легче сломать по сравнению с другими алгоритмами хеширования.

SHA1

Алгоритм SHA1 (Secure Hash Algorithm) был преемником MD5 и имел возможность хранить больше цифр из-за размера 160 бит. Несмотря на это, у него было много других проблем с безопасностью, и он больше не является хорошим выбором.

SHA2

Алгоритмы семейства SHA2 являются расширенной версией SHA1 и более безопасны. Они содержат больше цифр, и их длина дайджеста сообщения используется для их имен. Например, SHA-256. Они широко используются, и их труднее сломать.

Bcrypt

Это мой предпочтительный алгоритм хеширования. Тот факт, что у вас есть возможность увеличить количество итераций хэша, передав это число в качестве аргумента функции хеширования, делает этот алгоритм более безопасным.

А еще у него есть приятная особенность, вы можете передавать соли в функцию хеширования. Это еще больше повышает уровень безопасности.

Недостатком является то, что увеличение числа итераций делает функцию немного медленнее.

Пример кода Java с использованием Bcrypt

// Hashing a password with a salt
public String hashPassword(String password) {
    return BCrypt.hashpw(password, "@v&rY$ecured$@lt");
}

// Verify a hashed password
public boolean verifyHashedPassword(String password, String hash) {
    return BCrypt.checkpw(password, hash);
}

Заключение

Бэкенд-инженеру важно выбрать надежный алгоритм хеширования. Сильный алгоритм, который может принимать соль в качестве параметра, является более безопасным по сравнению с другими. SHA2 все еще широко используется сегодня, но все больше и больше заменяется Bcrypt.

Теперь вам предстоит сделать правильный выбор.