Криптография
Шифрование, кодирование и хеширование: что делает каждое
Разделяем кодирование, шифрование и хеширование на лабораторных с Base64, SHA-256 и OpenSSL. Почему Base64 ничего не защищает, а хеши необратимы.
Криптография с нуля: шифрование, ключи, хеши, подписи и почему шифр Цезаря учит идеям, но ничего не защищает.
Криптография — это набор математических методов защиты информации. Они сохраняют данные в тайне, показывают, что данные изменились, подтверждают отправителя сообщения и дают двум сторонам возможность доверять друг другу в сети, которую они не контролируют. Вы пользуетесь криптографией каждый раз, когда браузер открывает сайт по 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. Запускайте их на своей машине. Не вставляйте настоящие пароли или конфиденциальный текст на какие-либо сайты для проверки.
printf 'HELLO' | tr 'A-Z' 'D-ZA-C'Вывод:
KHOORОбратный сдвиг:
printf 'KHOOR' | tr 'D-ZA-C' 'A-Z'Вывод:
HELLOprintf 'HELLO' | sha256sum | cut -d' ' -f1
printf 'HELLP' | sha256sum | cut -d' ' -f1Вывод:
3733cd977ff8eb18b987357e22ced99f46097f31ecb239e878ae63760e83e4d5
d37f1f826f924dcd23aacbdc875edd4808b9e118d35adb9dce1c80cb23c4a9c1Изменение одной буквы меняет весь дайджест. Ничто в выводе не помогает восстановить HELLO. Чтобы проверить догадку, захешируйте её и сравните результат.
printf 'HELLO' | base64Вывод:
SEVMTE8=Любой, кто увидит SEVMTE8=, может его декодировать. Считайте это форматом: секрета здесь нет.
Начните с основных целей безопасности (конфиденциальность, целостность и доступность) из статьи об основах кибербезопасности. После неё прочитайте статью о шифре Цезаря, где подробнее разобраны подстановка и частотный анализ. Затем изучите хеширование, симметричные ключи и TLS по первоисточникам, перечисленным при этой статье, и не полагайтесь на пересказы.
Практикуйтесь на своей машине, на синтетических данных или в лаборатории, которая принадлежит вам или на тестирование которой у вас есть письменное разрешение.
Криптография
Разделяем кодирование, шифрование и хеширование на лабораторных с Base64, SHA-256 и OpenSSL. Почему Base64 ничего не защищает, а хеши необратимы.
Криптография
Почему быстрые хеши не годятся для паролей, что делают соль и коэффициент нагрузки и как хешировать и проверять пароли с Argon2id в Python через argon2-cffi.
Криптография
Публичные и приватные ключи с нуля: что доказывает подпись, почему приватный ключ остаётся в секрете, и лабораторная на Ed25519, где изменённый файл не проходит проверку.