Перейти к содержимому
New

DeepSeek V4.1 Flash free for 7 days: 10M tokens a day after a top-up of $10 or more. Until Nov 30.

How it works

Что такое криптография: шифрование, ключи, хеши и примеры из жизни

Криптография с нуля: шифрование, ключи, хеши, подписи и почему шифр Цезаря учит идеям, но ничего не защищает.

Начальный4 мин чтенияАвтор: NotHoly

Криптография — это набор математических методов защиты информации. Они сохраняют данные в тайне, показывают, что данные изменились, подтверждают отправителя сообщения и дают двум сторонам возможность доверять друг другу в сети, которую они не контролируют. Вы пользуетесь криптографией каждый раз, когда браузер открывает сайт по HTTPS, когда обновление ПО подписано или когда сайт проверяет ваш пароль, не храня его открытым текстом.

Шифрование — один из инструментов криптографии, а сама область шире.

Шифрование делает читаемые данные нечитаемыми

Шифрование берёт открытый текст и ключ, пропускает их через алгоритм и выдаёт шифртекст. Тот, у кого есть нужный ключ, может обратить процесс. Тот, у кого ключа нет, не должен извлечь из шифртекста ничего полезного.

Удобное сравнение — замок. Механизм замка — это алгоритм, а ключ — единственный предмет, который его открывает. Сравнение быстро перестаёт работать, потому что программный ключ — это число, кусок металла тут ни при чём. И всё же оно разделяет две вещи, которые часто путают: метод, который может быть публичным, и секретное значение, которое должно оставаться приватным.

Принцип Керкгоффса, сформулированный в девятнадцатом веке, гласит: система должна оставаться безопасной, даже когда о ней известно всё, кроме ключа. Современные криптографические схемы следуют этому правилу. Если схема работает только пока алгоритм скрыт, относитесь к ней с подозрением.

Симметричное и асимметричное шифрование

При симметричном шифровании один секретный ключ и шифрует, и расшифровывает. AES — стандартный симметричный блочный шифр, описанный NIST в FIPS 197. Симметричное шифрование быстрое, поэтому на него приходится основной объём данных в системе. Сложность в том, чтобы обе стороны получили один и тот же ключ и атакующий его не увидел.

Выбор AES — только первое решение. От режима работы, обращения с nonce и наличия аутентификации шифртекста зависит, безопасна ли схема. «Мы используем AES» годится как начало разговора, объяснением это не считается.

При асимметричной криптографии у каждой стороны есть пара ключей: публичный, который может видеть кто угодно, и приватный, который остаётся у владельца. Асимметричные схемы дают двум сторонам возможность согласовать общий секрет по открытому каналу, а подписанту доказать, что у него есть приватный ключ. TLS 1.3 использует асимметричные операции в рукопожатии, чтобы согласовать ключи и проверить личность сервера, а затем переключается на симметричное шифрование данных. Эта схема описана в RFC 8446.

Хеширование и шифрование — разные вещи

Криптографическая хеш-функция принимает вход любой длины и возвращает дайджест фиксированной длины. SHA-256, описанная в FIPS 180-4, всегда возвращает 256 бит. Хорошая хеш-функция делает практически невозможным поиск двух входов с одним дайджестом и восстановление входа по дайджесту. Ключа и шага расшифровки здесь нет.

Хеши полезны для проверки целостности. Если дайджест скачанного файла совпадает со значением, опубликованным вендором, файл, весьма вероятно, тот самый, что опубликовал вендор. Хеши также встречаются внутри подписей и многих других протоколов.

Паролям мало простого хеша. Быстрая функция вроде SHA-256 даёт атакующему возможность проверять огромное число догадок в секунду на подходящем оборудовании. OWASP Password Storage Cheat Sheet рекомендует намеренно медленную функцию с большими затратами памяти, например Argon2id, со своей солью для каждого пароля и параметрами под ваше оборудование. Argon2 определён в RFC 9106.

Кодирование и шифрование — разные вещи

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

  • Кодирование меняет формат, и обратить его может любой.
  • Шифрование скрывает содержимое, и обратить его может только владелец ключа.
  • Хеширование даёт отпечаток содержимого и не предназначено для обращения.

Шифр Цезаря: хороший урок, плохой замок

Шифр Цезаря сдвигает каждую букву на одну и ту же величину. При сдвиге на три A становится D, H становится K и так далее. Это шифр подстановки, и в нём уже есть основной словарь: открытый текст, ключ, шифртекст и алгоритм.

На реальных данных он проваливается по простой причине. В английском алфавите 26 букв, поэтому текст меняют только 25 сдвигов. Компьютер переберёт их мгновенно, а человек может проверить на бумаге. Частоты букв в длинном сообщении выдают сдвиг ещё быстрее. Поэтому шифр годится как упражнение в классе, защитой он не служит.

Команды ниже выполнялись в Git Bash на Windows 11 с его tr, sha256sum и base64. Запускайте их на своей машине. Не вставляйте настоящие пароли или конфиденциальный текст на какие-либо сайты для проверки.

Сдвиг сообщения вперёд и назад

bash
printf 'HELLO' | tr 'A-Z' 'D-ZA-C'

Вывод:

text
KHOOR

Обратный сдвиг:

bash
printf 'KHOOR' | tr 'D-ZA-C' 'A-Z'

Вывод:

text
HELLO

Как хеш реагирует на одну изменённую букву

bash
printf 'HELLO' | sha256sum | cut -d' ' -f1
printf 'HELLP' | sha256sum | cut -d' ' -f1

Вывод:

text
3733cd977ff8eb18b987357e22ced99f46097f31ecb239e878ae63760e83e4d5
d37f1f826f924dcd23aacbdc875edd4808b9e118d35adb9dce1c80cb23c4a9c1

Изменение одной буквы меняет весь дайджест. Ничто в выводе не помогает восстановить HELLO. Чтобы проверить догадку, захешируйте её и сравните результат.

Кодирование без шифрования

bash
printf 'HELLO' | base64

Вывод:

text
SEVMTE8=

Любой, кто увидит SEVMTE8=, может его декодировать. Считайте это форматом: секрета здесь нет.

Частые ошибки

  • Называть закодированные данные «зашифрованными». Base64 не даёт конфиденциальности.
  • Считать хеш обратимым контейнером. Хеш не вернёт исходный пароль. Можно только проверять по нему кандидатов.
  • Хранить пароли с быстрым хешем или без соли.
  • Писать собственный шифр или протокол. Используйте проверенные библиотеки и стандартные протоколы и следуйте их рекомендациям по режимам и параметрам.
  • Считать, что одно шифрование делает данные безопасными. Исход часто решают хранение ключей, контроль доступа и ПО вокруг шифра.

Что изучать дальше

Начните с основных целей безопасности (конфиденциальность, целостность и доступность) из статьи об основах кибербезопасности. После неё прочитайте статью о шифре Цезаря, где подробнее разобраны подстановка и частотный анализ. Затем изучите хеширование, симметричные ключи и TLS по первоисточникам, перечисленным при этой статье, и не полагайтесь на пересказы.

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

Источники

  1. NIST Cryptography glossary
  2. NIST Encryption glossary
  3. FIPS 197, Advanced Encryption Standard (AES)
  4. FIPS 180-4, Secure Hash Standard (SHS)
  5. RFC 8446, The Transport Layer Security (TLS) Protocol Version 1.3
  6. RFC 9106, Argon2 Memory-Hard Function for Password Hashing and Other Applications
  7. OWASP Password Storage Cheat Sheet
  8. MDN Web Docs: Base64 (glossary)

Ещё по теме: Криптография

Криптография

Пароли и хеширование с Argon2id

Почему быстрые хеши не годятся для паролей, что делают соль и коэффициент нагрузки и как хешировать и проверять пароли с Argon2id в Python через argon2-cffi.

Средний9 мин чтения