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

Контрольная сумма

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

Идея предельно проста: возьмите исходный номер карты и добавьте к нему контрольную цифру. Дополнительный номер можно использовать для обнаружения довольно большого количества ошибок, что позволяет обеспечить целостность. Контрольные суммы широко используются от кредитных карт до сетевых протоколов (вроде TCP). Они просты и эффективны. Некоторые даже можно использовать для исправления ошибок.

Однако есть одно важное предостережение: контрольные суммы предназначены для обнаружения случайных ошибок, а не злонамеренных модификаций! Взгляните на упомянутый выше алгоритм Луна; легко обмануть, если у вас есть базовые математические навыки.

Должно быть что-то для защиты от злонамеренного вмешательства, верно? Да, и это называется хэш.

Хэш

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

Так что же такое хэш?

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

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

Сопротивление прообразу

Учитывая значение хеш-функции h, должно быть трудно найти сообщение m, для которого hash(m) = h. Имеет смысл, так как хеш-функции односторонние.

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

Второе сопротивление прообразу

Учитывая сообщение m1, должно быть трудно найти другое сообщение m2, такое, что хеш(m1) = хэш(m2). Это более сильное свойство, чем предыдущее.

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

Сопротивление столкновениям

Должно быть очень сложно найти два разных сообщения m1 и m2, для которых хэш(m1) = хэш(m2).

Помните, когда Google объявил о первой коллизии SHA-1? Что ж, именно от этого и должно защищать сопротивление столкновений.

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

  • h1 = хэш(m1)
  • h2 = хэш(m2)
  • если h1 = h2, то m1 = m2 с очень высокой вероятностью

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

Ограничения

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

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

Хорошо, а как насчет всех тех сайтов, которые предлагают вам скачать хэш файла прямо рядом с файлом? Они хорошие?

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

Так как же проверить целостность данных/программ, загруженных из Интернета? Это все в следующем разделе.

Подпись и MAC

Знаете ли вы, что люди подписывали документы еще во втором веке? Неудивительно, что мы перенесли эту концепцию в наш цифровой мир. Мы также внесли некоторые улучшения. Цифровые подписи и MAC-адреса при правильном использовании намного надежнее, чем рукописные подписи.

Так что же такое цифровая подпись?

Цифровая подпись – это математическая схема, демонстрирующая подлинность цифровых сообщений или документов. Действительная цифровая подпись дает получателю основания полагать, что сообщение было создано известным отправителем (аутентификация), что отправитель не может отрицать отправку сообщения (неотказуемость) и что сообщение не было изменено при передаче (целостность). . — Википедия

Хорошо, что такое MAC?

В криптографии код аутентификации сообщения (MAC), иногда называемый тегом, представляет собой короткий фрагмент информации, используемый для аутентификации сообщения, другими словами, для подтверждения того, что сообщение пришло от указанного отправителя (его подлинности). и не был изменен (его целостность). — Википедия

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

Для MAC ключ, используемый для создания подписи и ключ, используемый для проверки, один и тот же, то есть он симметричен. Цифровые подписи используют пары ключей, закрытый ключ используется для подписи, а открытый — для проверки.

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

Целостность веб-токенов JSON защищена так называемой конструкцией HMAC. Эти токены передаются другим сторонам, которые не могут изменить их, не зная секрета, использованного при подписи. JWT — это, по сути, автономный фрагмент данных с проверкой целостности.

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

Вывод

Обеспечение целостности данных имеет решающее значение. Он используется в некоторых из наших самых фундаментальных протоколов: TCP, TLS, SSH. Как разработчик программного обеспечения, вы должны знать правильный инструмент для работы, когда речь идет о целостности. Давайте сделаем краткий обзор.

Контрольные суммы обеспечивают защиту от случайных ошибок и, возможно, исправление ошибок. Используйте их, когда вас не беспокоят злоумышленники. Хорошим примером является обнаружение ошибок из-за шума в среде (TCP).

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

Цифровые подписи и MAC-адреса обладают самыми сильными свойствами безопасности. Они создают часть данных, которая подтверждает целостность и подлинность, используя секрет. MAC используют симметричный секрет, а цифровые подписи используют асимметричную модель. Подпись/метка, создаваемая этими конструкциями, не может быть рассчитана без знания секрета. Это идеально подходит для крайне ненадежных сред, таких как Интернет (сертификаты TLS, JWT).

Последний совет. Не внедряйте собственную схему защиты целостности. Используйте проверенные решения: CRC32 для контрольных сумм, SHA256 или SHA512 для хэшей, RSA или ECDSA для цифровых подписей и HMAC для MAC.

Комментарии, вопросы? Начните обсуждение прямо ниже.

Хочу больше? Заходите в Securitydrops и подписывайтесь.

Data Integrity Primer — это сообщение от: Securitydrops.