Пароли и хеши: как защищают данные
Пароли — первая линия обороны. Понимание, как их безопасно хранят с помощью хеширования, помогает и защищаться, и создавать надёжные пароли.
Хеширование — это одностороннее преобразование данных в строку фиксированной длины. По хешу нельзя «восстановить» исходный пароль, но можно проверить, совпадает ли введённый.
Как сайты проверяют ваш пароль, не храня его в открытом виде? Ответ — хеширование. Это фундаментальная идея защиты, которую обязан понимать каждый.
Почему нельзя хранить пароли как есть
Если сайт хранит пароли в открытом виде и его базу украдут, злоумышленники мгновенно получат все пароли. Поэтому правильные сервисы хранят не пароль, а его хеш — необратимый «отпечаток». При входе сайт хеширует введённый пароль и сравнивает хеши. Сам пароль нигде не хранится.
Что такое соль
Если просто хешировать пароль, у одинаковых паролей будут одинаковые хеши, и это можно использовать против пользователей. Поэтому к паролю добавляют соль (salt) — уникальную случайную строку. Тогда даже одинаковые пароли дают разные хеши. Современные алгоритмы (bcrypt, argon2) делают это автоматически и специально работают медленно, чтобы перебор был затруднён.
Учебный пример: хеширование строки
Покажем хеширование на стандартной библиотеке Python. Это демонстрация концепции, а не «взлом» — мы хешируем свою же строку.
import hashlib
password = "MyStr0ng!Pass"
digest = hashlib.sha256(password.encode("utf-8")).hexdigest()
print("Пароль:", password)
print("SHA-256 хеш:", digest)
print("Длина хеша:", len(digest), "символов")
# одинаковый ввод -> одинаковый хеш
again = hashlib.sha256(password.encode("utf-8")).hexdigest()
print("Повтор совпадает:", digest == again)
Вывод:
Пароль: MyStr0ng!Pass SHA-256 хеш: ... (64 символа в шестнадцатеричном виде) Длина хеша: 64 символов Повтор совпадает: True
Примечание: SHA-256 хорош для демонстрации идеи хеша, но для хранения паролей в реальных системах используют медленные алгоритмы с солью (bcrypt, argon2).
Учебный пример: оценка надёжности пароля
Безопасный Python, который оценивает пароль по простым правилам. Это инструмент защиты — помогает выбрать надёжный пароль.
def password_score(pwd):
score = 0
if len(pwd) >= 12:
score += 1
if any(c.isdigit() for c in pwd):
score += 1
if any(c.isupper() for c in pwd) and any(c.islower() for c in pwd):
score += 1
if any(not c.isalnum() for c in pwd):
score += 1
return score
for p in ["12345", "Sunshine", "Tr0ub4dor&Long!"]:
print(p, "-> уровень", password_score(p), "из 4")
Вывод:
12345 -> уровень 1 из 4 Sunshine -> уровень 1 из 4 Tr0ub4dor&Long! -> уровень 4 из 4
Правила надёжного пароля
- Длина важнее сложности: лучше длинная фраза, чем короткий «сложный» набор.
- Уникальность: разные пароли для разных сервисов.
- Менеджер паролей хранит их за вас — это безопаснее, чем помнить.
- Двухфакторная аутентификация — обязательна для важных аккаунтов.
Понимая хеши и соль, вы понимаете, как устроена защита данных — и как создавать пароли, которые действительно защищают.