Блог

Как защитить файлы от злоумышленников: осваиваем шифрование

Разбираем базовые утилиты и команды
7 минут2474

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

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

Хеш-функции

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

Рассмотрим это на примере утилиты openssl, установленной в Linux. К примеру, у нас есть текстовый файл, содержащий «this is simple text»:

Вычислим от этого файла хеш-функцию при помощи алгоритма md5:

А теперь изменим содержимое файла:

Обратите внимание: мы добавили в файл новую строку («but changed»), вычислили заново хеш от файла, и он стал другим. То есть при любом изменении содержимого файла хеш-функция не останется прежней. Это можно использовать для контроля целостности критических файлов: если их хеш изменится — системному администратору придёт оповещение. Или для проверки, загрузился ли файл полностью: если это так, на сайте опубликуется его хеш.

В Windows для вычисления хеша я рекомендую утилиту Sigcheck из пакета Sysinternals. Для примера вычислим значение хеша md5 от файла PsExec.exe:

Другой вариант — использовать утилиту certutil, предустановленную в Windows. Вычислим с её помощью значение хеша md5 от файла PsExec.exe:

Также можно загрузить пакет openssl для ОС Windows. Качаем архив под нужную архитектуру процессора отсюда, распаковываем его и переходим в консоли в каталог bin. Нам нужен файл openssl.exe:

Теперь нам доступны почти все возможности пакета openssl в Windows. Например, вычислить хеш, как делали в предыдущих примерах для Linux (не забываем про абсолютные и относительные пути к файлам):

Пакет лучше переместить в каталог C:/OpenSSL, а конфигурационный файл openssl.cnf — из каталога bin в каталог OpenSSL. Избежим ошибки, как на скрине выше:

Теперь рассмотрим реализацию криптографических алгоритмов.

Симметричные криптоалгоритмы

Если говорить упрощённо, то симметричные алгоритмы шифрования применяют один ключ для шифрования и дешифрования. Таких алгоритмов много, и на практике обычно применяют те, которые имеют достаточную длину ключа и ещё не были скомпрометированы. Симметричные алгоритмы делятся на блочные (DES, RC2, Blowfish, AES, «Кузнечик» и т. д.) и потоковые (RC4, SEAL, CryptMT и другие).

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

Попрактикуемся: при помощи пакета openssl зашифруем созданный нами ранее текстовый файл. Для этого используем команду:

openssl enc -e -aes256 -in simpletext.txt -out simple_enc_text.txt

где:

  • enc — указывает модуль для шифрования;
  • -e — указывает, что файлы нужно шифровать;
  • -aes256 — алгоритм шифрования;
  • -in — указывает на исходный файл;
  • -out — указывает на зашифрованный файл.

Выглядит это так:

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

openssl enc -d-aes256 -in simple_enc_text.txt -out simpletext.txt 

где:

  • enc — указывает модуль для шифрования;
  • -d — указывает, что файлы нужно расшифровать;
  • -aes256 — алгоритм шифрования;
  • -in — указывает на исходный файл;
  • -out — указывает на расшифрованный файл.

При шифровании симметричными алгоритмами есть несколько интересных проблем.

  • Длина ключа. Как уже упоминали, желательно не менее 128 бит
  • Сложность использования при большом количестве шифруемых объектов — приходится запоминать много параметров.
  • Сложность обмена параметрами шифрования (паролями, алгоритмами и подобным) — необходимо обеспечить их надёжную передачу адресату.

Такие проблемы обычно решают при помощи асимметричных алгоритмов шифрования.

Асимметричные алгоритмы шифрования

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

Криптографическая система на основе асимметричного шифрования использует открытые (public key) и закрытые (private key) ключи для шифрования и расшифровки данных. Эти ключи образуют ключевую пару, компоненты которой связаны зависимостью, но отличаются друг от друга. Идея в том, что, зная открытый ключ, нельзя из него получить закрытый, хотя алгоритм генерации известен.

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

У многих асимметричных алгоритмов, особенно тех, что основаны на проблемах теории чисел, минимальная длина ключа для надёжного шифрования — 1024 бит. Это сильно ограничивает их применение — симметричные алгоритмы позволяют с меньшей длиной ключа надёжно зашифровать файлы.

При практической реализации асимметричных алгоритмов обычно используют сертификат. Это файл, хранящий ключ (открытый и закрытый) в определённом формате. Подробнее об этом можно почитать в статье «Формат SSL-сертификата».

Рассмотрим два основных стандарта для реализации сертификатов шифрования.

X.509 — стандарт ITU-T для инфраструктуры открытых ключей. Определяет стандартные форматы данных и процедуры распределения открытых ключей с помощью соответствующих сертификатов с цифровыми подписями. Именно он обычно используется для электронной цифровой подписи (ЭЦП) и шифрования, например, в openssl.

OpenPGP — стандарт, выросший из программы PGP (к середине 90-х годов она распространилась в интернете как надёжное средство шифрования электронной почты). Став стандартом де-факто, PGP начал встраиваться во множество приложений и систем. С особенностями можно ознакомиться на специализированном ресурсе об OpenPGP.

Посмотрим, как это выглядит на практике. Начнём с асимметричных алгоритмов в openssl — для этого в Windows командную строку надо запустить с правами администратора.

Создадим закрытый ключ в виде сертификата. Команда следующая:

openssl genrsa -aes256 -out private.pem 8912

где:

  • genrsa — указывает, что мы используем модуль для генерации закрытого ключа на основе алгоритма RSA;
  • -aes256 — указывает на алгоритм AES для шифрования сертификата;
  • -out private.pem — файл для сохранения сертификата;
  • 8912 — размер ключа.

Теперь надо извлечь из полученного закрытого ключа публичный. Сделать это можно командой:

openssl rsa -in private.pem -pubout -out public.pem

где:

  • rsa — модуль для работы с RSA;
  • -in private.pem — задаёт путь к закрытому ключу, из которого извлечём открытый;
  • -pubout — извлекает публичный ключ;
  • -out public.pem — имя файла для полученного открытого ключа.

Ключ мы получили в виде сертификата в формате pem (ASCII-файл в кодировке base64). Это не единственный формат хранения сертификатов — с другими можно ознакомиться в материале, который уже рекомендовался выше. 

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

  1. Генерируем сертификаты (пару из открытого и закрытого ключа).
  2. Шифруем текст симметричным алгоритмом AES (его вроде бы ещё не взломали). Предположим, получим файл enc.1.
  3. Далее выбранный для шифрования пароль шифруем публичным ключом (предположим, получим файл enc.2). 
  4. Теперь можно передать зашифрованный файл enc.1 и файл enc.2 по незащищённому каналу связи. 
  5. На другом конце у получателя должна быть вторая часть ключа (закрытый ключ). Ей он вначале расшифровывает файл enc.2 и извлекает оттуда пароль для дешифровки файла enc.1.
  6. Profit!

Вот как это выглядит на практике. Вначале шифруем текстовый файл алгоритмом AES (пароль 123456):

Теперь сохраним наш пароль (123456) в файл pass.txt. И зашифруем файл при помощи сертификата. Команда:

openssl rsautl -encrypt -inkey public.pem -pubin -in pass.txt -out pass.ssl

где:

  • rsautl — включаем модуль для шифрования, дешифрования и подписывания данных алгоритмом RSA;
  • -inkey public.pem — указывает путь к открытому ключу;
  • -pubin — указывает, что файл ключа является публичным ключом;
  • -in pass.txt — файл для шифрования;
  • -out pass.ssl — выходной зашифрованный файл.

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

Мы получили пароль — теперь с его помощью можно расшифровать файл, который мы с ним зашифровали при помощи алгоритма AES:

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

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

Работа с криптографическими алгоритмами — это лишь малая часть одного из курсов факультета информационной безопасности Geek University. Ближайший поток стартует 28 декабря — неплохой подарок на Новый год ;) Кроме того, до 29 декабря вы сможете выбрать ещё один факультет Geek University для себя или в подарок и получить его бесплатно.

информационная безопасностьинфобезшифрованиезащита файловкриптографиякриптографические алгоритмыsecurityпрограммирование
Нашли ошибку в тексте? Напишите нам.
Спасибо,
что читаете наш блог!
Posts popup