Менеджеры паролей и гигиена аккаунтов

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

Менеджер паролей — программа, которая генерирует, хранит в зашифрованном виде и подставляет уникальные сложные пароли, защищённые одним мастер-паролем.

Главная угроза: повторное использование паролей

Представьте, что вы используете один пароль на форуме, в почте и в банке. Форум взломали и утекла база. Теперь злоумышленник берёт ваш логин и пароль и пробует их везде — это называется credential stuffing (набивка учётных данных). Один и тот же пароль превращает мелкую утечку в компрометацию всех ваших аккаунтов.

Решение очевидно: уникальный пароль на каждый сайт. Тогда утечка одного сайта не затрагивает остальные. Но запомнить десятки уникальных паролей невозможно — поэтому и нужен менеджер.

Что делает менеджер паролей

  • Генерирует длинные случайные пароли (например, 20 символов), которые невозможно подобрать.
  • Хранит их в зашифрованном хранилище. Без мастер-пароля содержимое — бессмысленный набор байтов.
  • Подставляет пароль на нужном сайте, проверяя его адрес, что заодно защищает от фишинга на похожем домене.
  • Часто предупреждает, если пароль засветился в известной утечке.

Что делает пароль сильным

Сила пароля — это его непредсказуемость (энтропия), а она растёт прежде всего с длиной. Длинная фраза надёжнее короткого набора спецсимволов. Сравните, насколько дольше перебирать длинный пароль (грубая оценка числа комбинаций):

import math

def combinations_bits(alphabet_size, length):
    return length * math.log2(alphabet_size)

# 8 символов из 95 печатных против 16 символов из 26 букв
short = combinations_bits(95, 8)
long_phrase = combinations_bits(26, 16)

print(f"Короткий сложный (8 симв.): ~{short:.0f} бит энтропии")
print(f"Длинная фраза (16 букв)   : ~{long_phrase:.0f} бит энтропии")
print("Длина важнее набора символов:", long_phrase > short)

Вывод:

Короткий сложный (8 симв.): ~53 бит энтропии
Длинная фраза (16 букв)   : ~75 бит энтропии
Длина важнее набора символов: True

Каждый дополнительный бит энтропии удваивает время перебора. Поэтому длинные парольные фразы предпочтительнее коротких «P@ss1!».

Генерация случайного пароля правильно

Для паролей и токенов нужен криптографически стойкий генератор случайности — модуль secrets, а не обычный random (он предсказуем). Учебный пример:

import secrets
import string

alphabet = string.ascii_letters + string.digits
password = "".join(secrets.choice(alphabet) for _ in range(16))

print("Длина пароля:", len(password))
print("Все символы из разрешённого набора:",
      all(c in alphabet for c in password))

Вывод:

Длина пароля: 16
Все символы из разрешённого набора: True

(Сам пароль каждый раз будет новым — это и есть смысл случайности.)

Защита самого менеджера

Мастер-пароль — единственная точка, которую нужно запомнить, поэтому он должен быть длинным и уникальным, а на сам менеджер обязательно включают MFA. Тогда даже кража зашифрованного хранилища не раскроет пароли.

Итог

  • Повторное использование паролей превращает одну утечку в компрометацию всех аккаунтов (credential stuffing).
  • Решение — уникальный пароль на каждый сайт, что требует менеджера паролей.
  • Длина пароля важнее экзотических символов: она даёт больше энтропии.
  • Для генерации используйте криптостойкий источник случайности (secrets), а сам менеджер защитите MFA.
Проверьте себя
1. Что такое credential stuffing?
AПодбор пароля по словарю на одном сайте
BПеребор украденной пары логин+пароль сразу на множестве сайтов
CШифрование паролей в базе
DГенерация случайных паролей
2. Что сильнее всего повышает стойкость пароля?
AДобавление одного спецсимвола
BУвеличение длины пароля
CЗамена букв на похожие цифры
DИспользование имени с цифрой
3. Какой источник случайности подходит для генерации паролей?
AОбычный random — он достаточно случаен
BКриптостойкий генератор, например модуль secrets
CТекущее время в секундах
DЛюбая хэш-функция
Поддержать проект