SkillGridИзучай computer science на практике

Хеши, шифрование и подписи

Один инструмент прячет данные, другой только снимает отпечаток, третий доказывает авторство. Их путают — и системы ломаются.

15 мин · 45 XP

Три инструмента путают постоянно, и эта путаница приводит к реальным утечкам. Хеш — это отпечаток пальца: он доказывает, что две вещи одинаковы, не показывая оригинал. Шифрование — это запертый ящик: оно прячет данные, чтобы нужный человек потом их открыл. Цифровая подпись — это сургучная печать: она доказывает, кто написал и что по дороге ничего не изменили. Разные задачи — разные инструменты.

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

input            hash of the input
---------------  --------------------------------
hello            2cf24dba5fb0a30e26e83b2ac5b9e29e...
HELLO            5d41402abc4b2a76b9719d911017c592...
hello!           ce06092c8f0e3f0e2b8f6ec9c8f4b1f2...

one character changed  ->  a completely different hash
same input every time  ->  the same hash, alwaysХеш — это отпечаток, а не запертый ящик: он доказывает, что вход был тот же, и никогда не раскрывает сам вход.

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

BrowserShop serverHTTPS: here is my card numbereverything below happens inside TLSlock and key agreed oncescrambled bytesanyone reading the cable sees noise, not the card

Цифровая подпись отвечает на другой вопрос: не «что здесь написано», а «кто это написал и не изменилось ли это». Ты подписываешь закрытым ключом, который никогда не покидает твою машину; проверить подпись может любой по открытому ключу. На этом стоят сертификаты HTTPS, и поэтому страница загрузки может дать тебе проверить, что файл — тот самый, который выложили разработчики.

openssl dgst -sha256 -sign release.key -out app.sig app.bin
openssl dgst -sha256 -verify release.pub -signature app.sig app.binВесь шаблон в двух строках: подпись создаёт маленький файл .sig, проверка его принимает или отклоняет.

Практика

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

    Подсказки
    • Спроси про каждый инструмент: можно ли вернуть из него исходный текст?
    • Отпечаток опознаёт, ящик прячет, подпись доказывает авторство.

    15 XP

  2. Два пользователя выбрали одинаковый пароль. Их хеши в базе выглядят совершенно по-разному. Почему?

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

    14 XP

  3. Почему TLS использует обмен ключами, а не просто отправляет обеим сторонам один общий секретный ключ?

    Подсказки
    • Общий секрет должен сначала попасть к обеим сторонам — и эта дорога и есть слабое место.
    • Подпись работает наоборот: ключ, доказывающий авторство, никогда не покидает владельца.

    16 XP