Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: MD5, password hashing, collision resistance, rainbow table, salt

Почему нельзя хранить пароли в виде MD5?

Вопрос проверяет понимание криптографической стойкости хеш-функций и важности безопасного хранения паролей.

Короткий ответ

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

Длинный ответ

Почему MD5 не подходит для хранения паролей?

MD5 (Message Digest 5) — это криптографическая хеш-функция, разработанная в 1991 году. Она создавалась для проверки целостности данных, а не для безопасного хранения паролей. Основные проблемы MD5 в контексте паролей:

  • Скорость: MD5 очень быстрая — современные GPU могут вычислять миллиарды хешей в секунду. Это делает атаки перебором (brute-force) и по словарю (dictionary attack) тривиальными.
  • Коллизии: Уже в 2004 году были найдены практические коллизии — два разных сообщения, дающих одинаковый хеш. Для паролей это означает, что злоумышленник может найти другой пароль, который даст тот же хеш, и войти в систему.
  • Отсутствие соли: Без соли (уникальной случайной строки, добавляемой к каждому паролю) одинаковые пароли дают одинаковый хеш. Это позволяет использовать радужные таблицы (precomputed hash tables) для мгновенного поиска пароля по хешу.

Пример уязвимости

Допустим, два пользователя выбрали пароль "password123". Без соли их хеши MD5 будут одинаковыми: 482c811da5d5b4bc6d497ffa98491e38. Если злоумышленник узнает хеш одного, он сразу узнает пароль для обоих. С солью каждый хеш уникален, даже если пароли совпадают.

Как правильно хранить пароли?

Современные рекомендации:

  • Используйте медленные хеш-функции: bcrypt, scrypt, Argon2 (победитель конкурса Password Hashing Competition).
  • Всегда добавляйте уникальную соль для каждого пароля (обычно генерируется случайно и хранится вместе с хешем).
  • Настройте фактор стоимости (cost factor), чтобы замедлить вычисление хеша (например, bcrypt с cost=12 занимает ~250 мс на CPU).

Пример кода на Node.js с bcrypt

const bcrypt = require('bcrypt');
const saltRounds = 12;

async function hashPassword(password) {
  const salt = await bcrypt.genSalt(saltRounds);
  const hash = await bcrypt.hash(password, salt);
  return hash; // сохраняем в БД
}

async function checkPassword(password, hash) {
  return await bcrypt.compare(password, hash);
}

Вывод: MD5 не предназначен для хранения паролей из-за высокой скорости, уязвимости к коллизиям и отсутствия встроенной поддержки соли. Для защиты пользовательских данных всегда используйте специализированные алгоритмы хеширования паролей, такие как bcrypt, scrypt или Argon2, с обязательным добавлением соли и настройкой фактора стоимости.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

Ключевые слова

#MD5

#password hashing

#collision resistance

#rainbow table

#salt

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.