{}const=>[]async()letfn</>var
РазработкаПрофессияОсновы

Криптография без боли: хэши, соль, шифрование, TLS — что реально нужно понимать новичку 🔐

Ты пишешь код, регистрируешь пользователей, хранишь пароли, отправляешь данные по сети — и вроде бы всё работает. А потом узнаёшь, что пароли хранились в базе открытым текстом, и кто-то их уже слил. Знакомо?

К

Кодик

Автор

6 мин чтения

Криптография — это не предмет для математиков с PhD. Это инструмент, который каждый разработчик обязан понимать хотя бы на базовом уровне. Без этого ты не сможешь написать безопасное приложение. Точка.

Хэширование: отпечаток пальца для данных

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

"привет"  →  SHA-256  →  "a1b2c3d4e5..."  (64 символа, всегда)
"приветт" →  SHA-256  →  "f7g8h9i0j1..."  (совершенно другой хэш!)

Ключевые свойства хэша:

Односторонность — из хэша нельзя восстановить исходные данные. Это как сжечь книгу и получить пепел определённого цвета. По цвету пепла книгу не восстановишь.

Детерминированность — одинаковый вход всегда даёт одинаковый выход. «привет» через SHA-256 всегда будет одним и тем же хэшем.

Лавинный эффект — изменение одного символа полностью меняет хэш. Это не «похожий» хэш — это абсолютно другая строка.

Где это применяется?

Хранение паролей — вместо самого пароля в базе хранится его хэш. При входе пользователь вводит пароль, система хэширует его и сравнивает хэши.

Проверка целостности файлов — скачал файл, посчитал хэш, сравнил с эталонным. Не совпал — файл повреждён или подменён.

Git — каждый коммит идентифицируется хэшем. Именно поэтому коммиты выглядят как a3f2b1c...

Какие алгоритмы использовать?

  • MD5 — устарел, не используй для безопасности (но для контрольных сумм файлов ещё ок)

  • SHA-1 — тоже устарел, найдены коллизии

  • SHA-256 — текущий стандарт для общего хэширования

  • bcrypt / Argon2 — специализированные алгоритмы для паролей (об этом ниже)

🔥 100 000+ учеников уже с нами

Устал читать теорию?
Пора кодить!

Кодик — приложение, где ты учишься программировать через практику. AI-наставник, интерактивные уроки, реальные проекты.

🤖 AI 24/7
🎓 Сертификаты
💰 Бесплатно
🚀 Начать учиться
Присоединились сегодня

Соль: почему просто хэшировать пароль — это мало

Допустим, ты хранишь хэши паролей. Звучит безопасно? Не совсем.

Проблема: у миллионов людей пароль «123456». Хэш этого пароля всегда один и тот же. Злоумышленник может заранее посчитать хэши для миллионов популярных паролей (это называется радужная таблица) и просто искать совпадения в твоей базе.

Соль — это случайная строка, которая добавляется к паролю перед хэшированием.

Без соли:
"123456" → SHA-256 → "8d969eef..."  (у всех одинаковый)

С солью:
"123456" + "x7Km9p" → SHA-256 → "4f2a8b71..."  (уникальный!)
"123456" + "Qw3rTy" → SHA-256 → "9c1d5e83..."  (тоже уникальный!)

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

Правила работы с солью

Соль должна быть уникальной для каждого пользователя. Одна соль на всю базу — это почти бесполезно.

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

Соль должна быть достаточно длинной. Минимум 16 байт.

На практике — используй bcrypt

Не изобретай велосипед. Алгоритм bcrypt (или Argon2) делает всё за тебя: генерирует соль, хэширует с нужным количеством итераций, и упаковывает результат в удобную строку.

// Node.js пример
const bcrypt = require('bcrypt');

// Хэширование пароля
const hash = await bcrypt.hash('мой_пароль', 12); // 12 раундов
// Результат: "$2b$12$LJ3m5... " — тут и алгоритм, и соль, и хэш

// Проверка пароля
const isValid = await bcrypt.compare('мой_пароль', hash); // true

Число раундов (12 в примере) — это «стоимость» хэширования. Чем больше — тем дольше считается хэш. Для злоумышленника, перебирающего миллионы вариантов, это критично.

Шифрование: когда данные нужно прочитать обратно

Хэширование — это дорога в один конец. А что если данные нужно защитить, но потом прочитать обратно? Тогда нужно шифрование.

Симметричное шифрование: один ключ

Один и тот же ключ используется и для шифрования, и для расшифровки. Как замок с одним ключом — кто его имеет, тот и открывает.

Текст + Ключ → [AES-256] → Шифротекст
Шифротекст + Тот же Ключ → [AES-256] → Текст

AES-256 — золотой стандарт симметричного шифрования. Используется везде: от мессенджеров до банковских систем.

Проблема: как передать ключ второй стороне безопасно? Если отправить его по открытому каналу — его перехватят. Это «задача обмена ключами».

Асимметричное шифрование: два ключа

Здесь появляется пара ключей: публичный (открытый) и приватный (секретный).

Публичный ключ — это как открытый почтовый ящик. Любой может бросить туда письмо. Но достать письмо может только тот, у кого есть ключ от ящика — приватный ключ.

Текст + Публичный ключ → [RSA] → Шифротекст
Шифротекст + Приватный ключ → [RSA] → Текст

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

Цифровая подпись — обратный процесс

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

TLS: как всё это работает вместе в интернете

Каждый раз, когда ты видишь 🔒 в браузере и https:// — это работает TLS (Transport Layer Security). И вот что происходит за кулисами при каждом HTTPS-запросе.

Рукопожатие (TLS Handshake)

Шаг 1. Твой браузер говорит серверу: «Привет, хочу безопасное соединение. Вот алгоритмы, которые я поддерживаю.»

Шаг 2. Сервер отвечает: «Привет! Вот мой сертификат (с публичным ключом), и давай используем вот эти алгоритмы.»

Шаг 3. Браузер проверяет сертификат — реально ли он выдан доверенным центром сертификации (CA), не просрочен ли, соответствует ли домену.

Шаг 4. Используя асимметричное шифрование, браузер и сервер договариваются о сессионном ключе — это симметричный ключ, который будет использоваться дальше.

Шаг 5. Всё дальнейшее общение идёт через быстрое симметричное шифрование (AES).

Почему именно так?

Асимметричное шифрование надёжно, но медленное. Симметричное — быстрое, но нужен безопасный обмен ключами. TLS элегантно комбинирует оба подхода: асимметричное — для обмена ключами, симметричное — для передачи данных.

Что может пойти не так?

  • Самоподписанные сертификаты — браузер им не доверяет, и правильно делает

  • Устаревшие версии TLS — TLS 1.0 и 1.1 уязвимы, используй минимум TLS 1.2

  • Man-in-the-Middle — атака, при которой кто-то встаёт между тобой и сервером. TLS защищает от неё, если сертификат валидный

JWT: токены, которые ты видишь каждый день

Если ты работаешь с веб-приложениями, ты точно сталкивался с JWT (JSON Web Token). Это компактный способ передавать проверенные данные между сторонами.

JWT состоит из трёх частей, разделённых точками:

eyJhbGci... . eyJzdWIi... . SflKxwRJ...
   Header      Payload       Signature

Header — алгоритм подписи (например, HS256).

Payload — данные (например, ID пользователя, роль, срок действия).

Signature — подпись, которая гарантирует, что токен не подделан.

Важно понимать

JWT подписан, но не зашифрован (по умолчанию). Payload закодирован в Base64 — это не шифрование, это просто кодировка. Любой может декодировать и прочитать содержимое. Не клади туда пароли или секретные данные.

Подпись гарантирует целостность: если кто-то изменит payload, подпись перестанет совпадать.

Учи программирование с практикой 🚀

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

А ещё у нас есть сообщество в Телеграм, где регулярно выходят полезные посты по программированию, разборы задач, объяснения концепций. Это отличный способ повторять материал в удобном месте — в дороге, в перерыве, перед сном. Подписывайся и прокачивайся каждый день!

Итого

Криптография в повседневной работе разработчика — это не сложная математика. Это набор инструментов и правил.

Хэши — необратимые отпечатки данных. Соль — защита от массовых атак на пароли. Симметричное шифрование — быстрая защита данных одним ключом. Асимметричное шифрование — безопасный обмен ключами и цифровые подписи. TLS — комбинация всего вышеперечисленного для защиты интернет-трафика.

Ты не обязан знать, как именно работает AES на уровне битовых операций. Но ты обязан знать, когда что применять и каких ошибок избегать.

Безопасность — это не фича, которую «потом добавим». Это фундамент.

🎯Хватит откладывать

Понравилась статья?
Пора применять на практике!

В Кодик ты не просто читаешь — ты сразу пишешь код. Теория + практика = реальный скилл.

Мгновенная практика
🧠AI объяснит код
🏆Сертификат

Без регистрации • Без карты