Быстрый хеш, например SHA-256, позволяет атакующим проверять на GPU миллиарды вариантов в секунду. Функции хеширования паролей добавляют уникальную случайную соль для каждого пароля (она делает бесполезными заранее вычисленные таблицы) и настраиваемую стоимость вычисления. OWASP в Password Storage Cheat Sheet рекомендует, в порядке предпочтения: Argon2id (RFC 9106) с объёмом памяти не менее 19 МиБ, 2 итерациями и параллелизмом 1; scrypt с N = 2¹⁷, r = 8, p = 1; bcrypt с коэффициентом стоимости (work factor) 10 или больше (он обрезает входные данные до 72 байт); а там, где требуется FIPS 140, — PBKDF2-HMAC-SHA256 с числом итераций не менее 600 000.
Храните алгоритм и параметры вместе с хешем (строковый формат PHC $argon2id$v=19$m=19456,t=2,p=1$…, у bcrypt — $2b$10$…), чтобы позже можно было повысить стоимость, а старые хеши обновить при следующем входе. Необязательный перец (pepper) — секрет, который хранится вне базы данных, — добавляет защиту на случай, если утечёт только база данных.
NIST SP 800-63B-4 требует хранения с солью и повышенной вычислительной стоимостью, а для паролей, которые служат единственным фактором аутентификации, ещё и минимальной длины 15 символов. Ключи доступа полностью избавляют от хранимого секрета: сервер хранит только открытый ключ.