Karhin’s Blog
About technologies and life

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

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

Терминология

Она очень странная и непривычная: таких слов в обычной жизни не встретишь. Какие-то ключи, кодирования, шифрования, декодирования, хэши, эллиптические кривые, ааа.

Зануды будут сразу вас поправлять и морщиться, когда вы перепутаете кодирование с шифрованием, но теперь вы будете точно знать, что кодирование это про алкоголиков – это преобразование фотографий котиков в формат, подходящий для обработки другой программой, а шифрование, чтобы никто другой больше не смог посмотреть котиков, пока они передаются или хранятся. Короче, кодирование – это не про безопасность.

Кодирование и декодирование не предполагает наличие какого-то секрета или пароля, а шифрование и дешифрование предполагает. Еще помните, что хэширование – это поезд в одну сторону. Хэш вообще нельзя расшифровать.

Хэширование

Хэш – это результат хэш-функции или операции хэширования. Хэш от английского hash – беспорядок, путаница. В общем, это какое-то беспорядочное значение фиксированного размера, которое получается от некоторого вполне порядочного любого размера. Хэширование рядом с шифрованием, но не имеет к нему прямого отношения.

Вот например у вас есть фотография котика и у вашего друга есть такая же фотография котика, но нам нужно точно удостовериться, что у нас точно одинаковые котики.

Простой вариант в том, чтобы просто скинуть друг-другу эти фотографии и сравнить их 1 в 1, но что если у нас 4K HDR видео котика на один час в несколько десятков гигабайтов? Каждый раз как-то скидывать друг-другу это видео? А если видео ломается при пересылке или лучший файлообменник мессенджер, в котором мы это делаем, подменяет кадры с котиком?

Хэш-функция придёт на помощь и превратит нашего котика в бессмысленную строку! Есть очень много разных функций для хэширования, например, MD5, SHA-1 и SHA-2.

Наглядное превращение котика в 64 символа случайного текста.

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

Но это всё равно не решает проблему с тем, что котика могут подменить, а по телефону с помощью дипфейков робот зачитает нам неверный хэш, поэтому мы пойдём немного дальше: придумаем какой-то секрет, который будете знать только вы, ваш друг и никто больше.

Упрощённая схема того, как работает HMAC.

Вы прохэшируете вашего котика, добавите этот секрет к хэшу котика и потом захэшируете его ещё раз. Примерно в этом смысл ещё одного страшного термина – HMAC. С поправкой на то, что HMAC работает чуть-чуть сложнее, чтобы уменьшить количество возможных атак на ваш котообмен.

HMAC – hash-based message authentication code.

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

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

Ещё одно применение хэш-функций – это хранение паролей. Вы слышали истории про утечки баз данных сайтов или сами попадали в ситуацию, когда какой-то индюк из Индии в 3 часа ночи залогинился в вашем аккаунте в Инстаграм?

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

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

Кстати, это одна из самых главных причин использовать менеджеры паролей с уникальными паролями для всех сайтов. Придумывание паролей по маске или что-то такое спасёт вас только от автоматизированных атак, но если живой человек увидит пароль superpassword_google.com, то, наверное, он что-то заподозрит.

В идеальном мире вероятность получить одинаковый хэш для разных входных данных стремится к нулю. Если двум входным значениям соответствует одинаковое выходное, то это значит, что произошла коллизия.

Теоритически злой пёсель выдал такой же хэш, как и котик!

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

Такое случается с алгоритмами достаточно часто. Например, SHA-1 уже можно сломать за копейки. Такая же ситуация с MD5 уже много лет.

Значит ли это, что эти алгоритмы уже прямо совсем нельзя использовать? В криптографических задачах точно не стоит, но, чтобы сравнивать котиков в условиях, когда вопрос не о трёхзначных циферках, вполне себе можно.

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

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

Например, применяли шифр Цезаря или шифр сдвига, то есть брали алфавит и сдвигали его на некоторое количество символов. Ключ в данном случае – это количество символов на которое сдвинут алфавит. Такой шифр можно взломать на листке бумаги за несколько минут, попробуйте.

Расшифруйте секретное кодовое слово.

В интернетах обычно используется алгоритм AES с длиной ключа 128, 196 или 256 бит. Чем длиннее ключ, тем круче. Раньше использовали DES или 3DES (в старых системах до сих пор используют).

Современные алгоритмы шифрования – это чисто про математику и магию. Основная идея в том, чтобы из обычного сообщения получить набор кракозябр, который статистически не связан с оригинальным.

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

Откуда тогда эти истории про взломы всего, чего только можно, ведь всё же зашифровано? Но тут и секрет: обычно шифрование не взламывают.

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

Вероятность факапа на каждом этапе очень высокая.

А в чём проблема сгенерировать случайный ключ? Ну хотя бы в том, что компьютеры разрабатывают так, чтобы они были предсказуемыми. Мы же не хотим, чтобы два плюс два в айфоне давало каждый раз новый результат.

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

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

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

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

Ну то есть вы сгенерировали ключ, а другое приложение уже знает этот ключ. И никто ничего не заметил, никакого взлома шифрования, шпионских устройств и Джеймса Бонда.

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

А если вы уже можете встретиться лично и передать безопасно ключ, то зачем вам тогда вообще этим заниматься, если секреты можно обсудить лично.

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

А ещё внезапно ваш ключ засинхронизируется каким-то модным приложением в эти облака, ваш пароль от аккаунта куда-то утечёт и его взломают. Кто-то бесплатно получит ваши ключи.

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

Например, у Apple есть Secure Enclave – это отдельный сопроцессор, который умеет в аппаратное шифрование, генерацию случайных чисел и имеет изолированную от всего остального мира память. Плохая новость в том, что даже в этом сопроцессоре находят уязвимости.

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

Ассиметричное шифрование так называется, потому что в нём используется целых два ключа: один для шифрования, а второй для расшифрования. В симметричном один ключ для всего.

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

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

Вернёмся к котику, которого мы будем передавать в глобальной сети Интернет.

Мы всё так же сгенерируем AES ключ, которым зашифруем котика. Сгенерированный AES ключ мы зашифруем публичным ключом нашего друга.

Зашифрованный ключ и котика уже можно просто брать и передавать по сети. Собеседник расшифрует своим приватным ключом AES ключ, которым расшифрует собственно и самого котика. Вот такая вот многоходовочка.

А почему просто не зашифровать всё вместе публичным ключом друга? Можно и так, это тоже будет работать, но ассиметричные алгоритмы работают значительно медленнее, чем симметричные. Помните же, что мы собирались 4K HDR видео отправлять?

А какие подводные? Вам до сих пор точно нужно знать, что публичный ключ принадлежит вашему собеседнику и что приватный ключ вашего собеседника не украли. А ещё есть классическая атака, которая называется человек посередине или Man in the middle (MITM).

Электронные подписи

Электронные подписи нужны для того, чтобы точно подтвердить авторство чем-либо или согласие на что-либо. В законодательствах электронная цифровая подпись человека соответствует его собственной подписи. Вы же слышали про все эти электронные правительства?

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

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

Обычно подписывается не всё сообщение или весь файл, а его хэш.

Сертификаты

Рядом с электронными подписями и публичными ключами часто звучит слово сертификат. Сертификат – это файл специального формата, который описывает публичный ключ.

А ещё сертификаты тоже подписывают, но другие люди или программы. Так формируются цепочки доверия. На этой технологии строится весь этот безопасный интернет и HTTPS, но про это в другой раз.

Сертификат сайта, который вы смотрите.

Сквозное шифрование

Сквозное шифрование – это не какой-то алгоритм шифрования, а подход к тому, как организован обмен данными.

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

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

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

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

С помощью такой многоходовки, никто, кроме вас и собеседника, не может прочитать сообщение. Отсюда и само название “сквозное”.

А это прямо супер-пупер безопасно? Неа. Это не делает вашу переписку абсолютно безопасной и защищённой. Вернёмся к MITM или человеку посередине.

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

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

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

Что ещё можно почитать?

Много всего. Если стало интересно и хочется почитать ещё про криптографию и безопасность, то вот вам оптимистичная цитата из книги “Практическая криптография” (Шнейер Брюс):

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

Digital Криптография Шифрование Хэширование Мессенджеры

To post a comment, please log in or create an account.

Sign In

Первый iPhone
Первый iPhone

Возле первого айфона часто вижу приписки «Революционный», «Прорывной» и так далее. У меня совсем другое мнение по этому поводу.

1839
DALL-E: я снова верю в технологии
DALL-E: я снова верю в технологии

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

1805
Красивый Email за десять минут
Красивый Email за десять минут

Собственный домен для почты – это не привилегия бизнеса или программистов. Сделать его проще простого, но нужно потратить десять минут.

4854
Правильная реализация UIActivityViewController в SwiftUI
Правильная реализация UIActivityViewController в SwiftUI

С помощью Activity View Controller можно предоставить пользователю функции для взаимодействия с контентом в других приложениях. Реализуем его в SwiftUI.

3460