Почему не просто SHA-256?

Обычный криптографический хеш вроде — правильный инструмент для целостности, но неподходящий для хранения паролей, и причина — как раз то свойство, которое делает его хорошим в других местах: он быстр. Атакующий, укравший базу хешей SHA-256 паролей, может пробовать миллиарды догадок в секунду на обычном оборудовании, потому что каждая догадка — это всего один быстрый хеш. Распространённые пароли падают почти мгновенно. Скорость, достоинство хеша общего назначения, здесь — недостаток.

Хранение паролей требует хеша, который намеренно медленный и устойчив к специализированному оборудованию. Три строительных блока заставляют это работать: соление, настраиваемый фактор трудоёмкости и память-затратность.

Соление: победа над предвычислением

Соль (salt) — уникальное случайное значение, хранящееся рядом с каждым хешем пароля и подмешиваемое в хеширование. Без солей одинаковые пароли дают одинаковые хеши, так что атакующий может один раз предвычислить гигантскую таблицу хешей распространённых паролей («радужную таблицу», rainbow table) и мгновенно найти каждое совпадение. Уникальная соль на пароль делает это предвычисление бесполезным: атакующему приходится атаковать каждый хеш по отдельности, и один и тот же пароль хешируется по-разному для каждого пользователя. Современные функции хеширования паролей генерируют и хранят соль за вас.

Фактор трудоёмкости: сделать каждую догадку дорогой

Фактор трудоёмкости (или параметр стоимости) управляет тем, сколько вычислений требует каждый хеш. Установите его так, чтобы один хеш был достаточно медленным, чтобы оставаться незаметным при законном входе (несколько сотен миллисекунд), но карающим в масштабе. Поскольку это параметр, вы можете повышать его с годами по мере ускорения оборудования, удерживая стоимость угадывания примерно постоянной. Это та рукоятка, которой у хеша общего назначения попросту нет.

Три стандартных выбора

  • bcrypt — давний, хорошо изученный вариант, построенный на шифре Blowfish с настраиваемым фактором стоимости. Безопасное значение по умолчанию там, где он доступен.
  • scrypt добавляет память-затратность: он намеренно потребляет настраиваемый объём памяти, что притупляет атакующих, использующих GPU и заказные чипы, поскольку те масштабируют вычисления гораздо дешевле памяти.
  • Argon2 выиграл Password Hashing Competition в 2015 году и является текущей рекомендацией для новых систем. Он память-затратен с отдельными настройками для памяти, времени и параллелизма; вариант Argon2id — обычный выбор.

Любой из них — разумный выбор; кардинальное правило — использовать один из них, никогда голый быстрый хеш, и никогда не изобретать собственную схему.

Вывод

Используйте SHA-256инструменте хеширования) для контрольных сумм и целостности, где скорость — достоинство. Для паролей берите bcrypt, scrypt или Argon2, где медлительность и затраты памяти — весь смысл. Две задачи выглядят похоже и требуют противоположных инструментов.