Skip to content
Назад к блогу
Безопасность

Энтропия пароля: рассчитать и усилить ваши пароли

Освойте энтропию пароля: формулу, математику brute-force и почему длина побеждает сложность. С кодом на JS/Python и бесплатным генератором.

10 мин чтения

Энтропия пароля: как измерить и максимизировать стойкость пароля

Вам наверняка говорили, что «сильный пароль» нуждается в заглавных буквах, цифрах и специальных символах. Но P@$$w0rd! соответствует всем этим правилам — и при этом ломается за доли секунды.

Реальная мера стойкости пароля — не то, какие символы вы используете. Это энтропия: концепция из теории информации, которая численно оценивает, насколько ваш пароль на самом деле непредсказуем.

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

Энтропия ≠ полная безопасность. Высокая энтропия защищает от брутфорса по одному offline-снимку базы, но без современного KDF (Argon2id / scrypt / bcrypt), уникальной соли на запись и регулярной ротации app-уровневого pepper она не спасает от утечки. Энтропия — это математика стойкости пароля как таковой; реальная защита аккаунтов — это связка «случайная генерация на клиенте, медленный хеш на сервере, защита канала, MFA».

Что такое энтропия пароля?

Энтропия пароля измеряет, насколько пароль непредсказуем, и выражается в битах. Каждый дополнительный бит энтропии удваивает количество попыток, которое атакующему нужно для подбора через brute-force.

Думайте об этом как о кубиках. У шестигранного кубика около 2,6 бита энтропии на бросок — всего 6 возможных исходов. У двадцатигранного — около 4,3 бита: больше граней, больше неопределённости.

Пароли работают так же: больше возможных символов (более «крупные кубики») и больше символов в пароле (больше «бросков») — оба фактора увеличивают энтропию.

Поэтому энтропия — лучшая мера, чем правила сложности. Пароль может выглядеть сложным (Tr0ub4dor&3), но иметь низкую энтропию из-за предсказуемых шаблонов. Тем временем простая на вид парольная фраза (correct horse battery staple) может иметь высокую энтропию, потому что выбрана из большого пула.

Формула: как рассчитать энтропию пароля

Формула проста:

E = L × log₂(R)

Где:

  • E — энтропия в битах
  • L — длина пароля (количество символов)
  • R — размер пула (количество возможных символов на позицию)

Размеры пула символов

Тип символовРазмер пула (R)Бит на символ
Только нижний регистр (a-z)264,70
Нижний регистр + цифры365,17
Верх + низ + цифры625,95
Полный печатный ASCII946,55
Список слов Diceware777612,92 на слово

Рассчитайте в коде

// Расчёт энтропии пароля на JavaScript
const entropy = (length, poolSize) =>
  length * Math.log2(poolSize);

entropy(8, 26);   // → 37.60 бит (только нижний регистр)
entropy(12, 62);  // → 71.45 бит (буквенно-цифровой)
entropy(16, 94);  // → 104.87 бит (полный набор)
import math

def entropy(length: int, pool_size: int) -> float:
    return length * math.log2(pool_size)

entropy(8, 26)   # → 37.60 бит
entropy(12, 62)  # → 71.45 бит
entropy(16, 94)  # → 104.87 бит

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

Сколько энтропии достаточно?

Ответ зависит от того, что вы защищаете и насколько быстро атакующий может подбирать.

Современные GPU тестируют свыше 10¹² (один триллион) хешей пароля в секунду против быстрых алгоритмов вроде MD5. Что это означает на практике (модель угрозы как защитника — это математика того, против чего мы защищаемся):

Энтропия (бит)СтойкостьВремя взлома при 10¹² попыток/сРекомендуется для
< 40СлабыйМенее 1 секундыНе использовать
40–59СреднийОт секунд до часовОдноразовые аккаунты
60–79СильныйОт дней до столетийОбычные аккаунты
80–99Очень сильныйТысячелетия+Почта, банки
100+ЭкстремальныйЗа пределами тепловой смерти ВселеннойКлючи шифрования, мастер-пароли

16-символьный пароль с полным печатным ASCII-набором даёт около 105 бит энтропии — глубоко в зоне «экстремальный». Сгенерировать такой можно мгновенно нашим генератором случайных паролей, который показывает анализ энтропии в реальном времени для каждого пароля.

Что говорит NIST (обновление 2024)

NIST SP 800-63B, обновлённый в 2024-м, внёс существенные изменения в рекомендации по паролям:

  • Убраны обязательные правила сложности (никакого принудительного спецсимвола)
  • Убраны обязательные периодические смены пароля
  • Поднят минимум до 15 символов (было 8 в предыдущих версиях)
  • Подчёркивается проверка по базам утёкших паролей
  • Предпочтение длине и случайности перед сложностью

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

Почему длина побеждает сложность

Посмотрим на математику. Рассмотрим два способа увеличить энтропию для 12-символьного пароля:

Вариант A — оставить 12 символов, переключиться с буквенно-цифровых (62) на полный ASCII (94):

  • 12 × log₂(94) − 12 × log₂(62) = 78,66 − 71,45 = +7,21 бита

Вариант B — оставить буквенно-цифровые (62), добавить ещё один символ (12 → 13):

  • 13 × log₂(62) − 12 × log₂(62) = 77,40 − 71,45 = +5,95 бита

Один дополнительный символ даёт почти столько же энтропии, сколько переход к гораздо большему набору. Добавьте два символа — и вы превзойдёте этот выигрыш.

Теперь рассмотрим P@$$w0rd! (9 символов). Он использует полный ASCII-пул, но слишком короткий. Хуже того, он следует предсказуемому шаблону «leet speak», который словарные атаки уже покрывают, поэтому его реальная энтропия гораздо ниже теоретических 59 бит.

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

Парольная фраза против случайного пароля

ПараметрСлучайный парольПарольная фраза (Diceware)
ПримерkX#9mP$2vL!nQ7wRcorrect horse battery staple
Бит на единицу6,55 на символ12,92 на слово
Длина для ~78 бит12 символов6 слов
ЗапоминаемостьПлохаяХорошая
Ввод на мобильномБолезненныйЛёгкий
Лучше всего дляЗаписей в менеджере паролейМастер-паролей, заучиваемых логинов

Как работает Diceware

Diceware использует список из 7776 слов (6⁵ = 7776). Вы бросаете пять кубиков, чтобы выбрать каждое слово, получая ровно 12,92 бита энтропии на слово.

Четыре слова дают ~51 бит; шесть слов — ~77 бит.

Что выбрать?

  • Для паролей, хранящихся в менеджере: используйте случайные пароли 16+ символов с полным набором символов. Вы никогда не вводите их вручную, поэтому запоминаемость не важна. Наш генератор случайных паролей может сгенерировать пакетом до 50 за раз.
  • Для мастер-пароля: используйте 5–6-словную парольную фразу Diceware. Она запоминается достаточно для ежедневного ввода и при этом даёт 64–77 бит энтропии.
  • Для API-ключей и токенов: используйте openssl rand или crypto.randomBytes() — максимальная энтропия без требования к запоминаемости человеком.

Энтропия на практике: инструменты разработчика и код

Вот наиболее распространённые способы, которыми разработчики генерируют секреты с высокой энтропией:

Браузер (Web Crypto API)

// Криптографически стойкая генерация пароля
function generatePassword(length, charset) {
  const array = new Uint32Array(length);
  crypto.getRandomValues(array);
  return Array.from(array, v => charset[v % charset.length]).join('');
}

const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*';
generatePassword(16, chars);
// → 'kX#9mP$2vL!nQ7wR' (случайно при каждом вызове)

Node.js

const crypto = require('crypto');
const token = crypto.randomBytes(32).toString('base64url');
// → 'Ql2Hj8xK9mNp3rVw5tYz7uBa0cEf4gIk' (43 символа, 256 бит)

Python

import secrets
token = secrets.token_urlsafe(32)  # 256 бит энтропии
password = secrets.token_hex(16)    # 128 бит, hex-формат

Командная строка

# 192 бита энтропии, base64-кодирование
openssl rand -base64 24

# 256 бит, hex-кодирование
openssl rand -hex 32

Сравнение энтропии по методу

МетодДлина выводаЭнтропия (бит)
UUID v436 символов122
openssl rand -base64 2432 символа192
16-символьный полный ASCII16 символов105
6-словный Diceware~30 символов78
4-словный Diceware~20 символов52

Никогда не используйте Math.random() ни для чего, связанного с безопасностью. Он использует некриптографический PRNG — вывод предсказуем, если атакующему известен seed. Всегда используйте crypto.getRandomValues() в браузере или crypto.randomBytes() в Node.js.

Хранение паролей: почему одной энтропии недостаточно

Даже 128-битный пароль ничего не стоит, если сервер хранит его как plain MD5-хеш. Когда база утекает, атакующие тестируют триллионы MD5-хешей в секунду на одном GPU.

Здесь в дело вступают медленные алгоритмы хеширования. Они умышленно делают каждую попытку дорогой:

АлгоритмСкорость на GPUЭффективное замедление
MD5~10 миллиардов/сБазовая (не использовать)
SHA-256~5 миллиардов/с~2× медленнее
bcrypt (cost=12)~5/с~2 миллиарда× медленнее
argon2id~2/с~5 миллиардов× медленнее

Параметр cost у bcrypt особенно изящен: каждое приращение удваивает требуемую работу. Cost-фактор 12 означает 2¹² = 4096 раундов хеширования. Это эффективно добавляет 12 бит «энтропии хранения» поверх собственной энтропии пароля.

Модель двойной защиты: пароли с высокой энтропией защищают от offline-брутфорса, а медленное хеширование защищает от утечек базы. Нужно и то, и другое. Соль на запись, app-уровневый pepper, регулярная ротация и аудит логов завершают список.

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

Распространённые мифы о паролях

«Меняйте пароль каждые 90 дней»

Рекомендации NIST 2024 явно против обязательных периодических смен. Частые ротации заставляют пользователей выбирать более слабые, более предсказуемые пароли — добавлять цифру в конце, циклить по небольшому набору. Меняйте пароли только тогда, когда есть основания считать, что они скомпрометированы.

«a→@, e→3 делает его сильнее»

Замены в стиле leet speak — одни из первых шаблонов, которые проверяют словарные атаки. Замена a на @ в password практически не добавляет энтропии, потому что атакующие уже её ожидают.

Энтропию увеличивает истинная случайность, а не «умные» замены.

«8 символов со спецсимволами достаточно»

Даже с полным 94-символьным ASCII-набором 8 символов дают всего 52 бита энтропии. При 10¹² попыток в секунду это взламывается примерно за 75 минут.

Используйте минимум 12 символов, 16+ для важных аккаунтов.

«Чем сложнее выглядит, тем безопаснее»

Визуальная сложность и энтропия — разные вещи. Tr0ub4dor&3 выглядит сложным, но следует предсказуемому шаблону «базовое слово плюс замены». mfYq8kL2nR выглядит проще, но имеет более высокую энтропию, потому что действительно случаен.

Подробнее о построении полной стратегии безопасности — основы веб-безопасности.

FAQ

Сколько бит энтропии считается безопасным?

Для большинства онлайн-аккаунтов 60–80 бит дают сильную защиту. Для целей высокой ценности вроде мастер-паролей или ключей шифрования стремитесь к 100+ бит. Каждый дополнительный бит удваивает требуемые усилия атакующего.

Всегда ли добавление спецсимволов увеличивает энтропию?

Только если символы выбраны случайно из полного пула. Предсказуемые замены вроде @ вместо a или ! в конце практически не добавляют энтропии, потому что атакующие уже учитывают эти шаблоны в своих словарях.

Какова энтропия 4-словной парольной фразы Diceware?

При стандартном списке Diceware из 7776 слов каждое слово вносит 12,92 бита. Четыре слова дают примерно 51,7 бита — приемлемо для низкорискованных применений. Для важных аккаунтов используйте 5–6 слов (64–78 бит).

Безопасно ли использовать Math.random() для генерации паролей?

Нет. Math.random() — псевдослучайный генератор, не криптостойкий. Используйте crypto.getRandomValues() в браузере или crypto.randomBytes() в Node.js для security-чувствительной случайной генерации.

Как параметр cost у bcrypt влияет на безопасность?

Каждое приращение cost-фактора bcrypt удваивает вычисления, требуемые для хеширования (а значит, и для брутфорса) пароля. Cost = 12 означает 2¹² = 4096 итераций, эффективно добавляя 12 бит трудности поверх собственной энтропии пароля.

Что изменилось в рекомендациях NIST по паролям 2024?

NIST SP 800-63B убрал обязательные требования сложности (принудительные спецсимволы, смешанный регистр) и периодическую ротацию паролей. Новое руководство предпочитает более длинные пароли (рекомендуется 15+ символов), проверку по базам утечек и разрешение всех печатных символов, включая пробелы.

Ключевые выводы

  1. Энтропия = L × log₂(R) — каждый дополнительный бит удваивает число необходимых попыток
  2. Длина > сложность — добавление одного символа эффективнее расширения набора символов
  3. Используйте крипто-APIcrypto.getRandomValues() или crypto.randomBytes(), никогда Math.random()
  4. Менеджер паролей + случайная генерация — лучшая практика для большинства людей
  5. Серверная сторона тоже важна — используйте bcrypt или argon2, никогда не храните пароли с MD5

Готовы сгенерировать пароль с высокой энтропией? Попробуйте наш генератор случайных паролей — он показывает анализ энтропии в реальном времени для каждого создаваемого пароля.

Похожие статьи

Все статьи