Обеспечение целостности и подлинности данных с помощью криптографии

CompTIABeginner
Практиковаться сейчас

Введение

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

Эта лабораторная работа познакомит вас с фундаментальными криптографическими практиками в системе Linux. Вы узнаете о:

  • Хешировании: Создании уникального "отпечатка" файла фиксированного размера. Если файл изменится хотя бы на один бит, хеш полностью изменится. Мы будем использовать алгоритмы MD5 и SHA256.
  • Цифровых подписях: Использовании закрытого ключа для "подписи" файла, что позволяет любому, у кого есть соответствующий открытый ключ, проверить подлинность файла и то, что он не был изменен.
  • Шифровании: Запутывании содержимого файла таким образом, чтобы его мог прочитать только тот, у кого есть правильный ключ для его расшифровки, обеспечивая конфиденциальность.

Мы будем использовать стандартные инструменты командной строки Linux, включая md5sum, sha256sum и GnuPG (gpg), реализацию стандарта Pretty Good Privacy (PGP) от GNU. К концу этой лабораторной работы вы сможете уверенно хешировать, подписывать, проверять, шифровать и расшифровывать файлы.

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня начальный с процентом завершения 94%. Он получил 100% положительных отзывов от учащихся.

Вычисление хешей файлов (MD5 и SHA256)

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

Сначала мы используем команду md5sum для расчета MD5-хеша файла important_data.txt, который был предварительно создан в вашем каталоге ~/project.

Выполните следующую команду в терминале:

md5sum important_data.txt

Вы увидите вывод, состоящий из хеш-значения, за которым следует имя файла:

d9e21981521545759153147864347199  important_data.txt

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

Теперь давайте рассчитаем SHA256-хеш с помощью команды sha256sum:

sha256sum important_data.txt

Вывод будет представлять собой более длинный и безопасный хеш:

a39b2c414f234246a2535321238863141b1a4849443b9992994b4189317e8591  important_data.txt

Если бы вы изменили что-либо в important_data.txt, как MD5, так и SHA256 хеши полностью изменились бы, что позволило бы вам легко обнаружить любые несанкционированные изменения.

Установка и настройка GnuPG (GPG)

На этом шаге вы установите GnuPG (GPG), инструмент, который мы будем использовать для цифровых подписей и шифрования. Хотя GPG часто предустановлен в современных дистрибутивах Linux, хорошей практикой является проверка его наличия и актуальности.

Сначала обновите список пакетов с помощью apt-get update. Вам нужно использовать sudo, поскольку управление пакетами требует административных привилегий.

sudo apt-get update

Затем установите пакет gnupg. Флаг -y автоматически отвечает "да" на любые запросы, делая установку неинтерактивной.

sudo apt-get install -y gnupg

После завершения установки вы можете проверить правильность установки GPG, проверив его версию.

gpg --version

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

gpg (GnuPG) 2.2.27
libgcrypt 1.9.4
Copyright (C) 2021 Free Software Foundation, Inc.
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /home/labex/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

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

Генерация пары ключей GPG для цифровых подписей

На этом шаге вы сгенерируете собственную пару ключей GPG, состоящую из закрытого ключа и открытого ключа.

  • Закрытый ключ (Private Key): Должен храниться в секрете. Он используется для расшифровки сообщений и создания цифровых подписей.
  • Открытый ключ (Public Key): Может свободно распространяться. Он используется для шифрования сообщений, предназначенных для вас, и для проверки ваших цифровых подписей.

Обычно команда gpg --full-generate-key запускает интерактивную настройку. Чтобы сделать этот процесс проще и неинтерактивным для лаборатории, мы будем использовать пакетный режим GPG. Сначала создайте файл параметров, который определяет детали для нашего ключа.

Используйте следующую команду cat с "here document" для мгновенного создания файла gen-key-params:

cat << EOF > gen-key-params
%echo Generating a basic key
Key-Type: RSA
Key-Length: 2048
Subkey-Type: RSA
Subkey-Length: 2048
Name-Real: LabEx User
Name-Email: user@labex.io
Expire-Date: 0
%no-protection
%commit
%echo done
EOF

Этот файл инструктирует GPG создать RSA-ключ длиной 2048 бит для пользователя с именем "LabEx User" и адресом электронной почты "user@labex.io". Ключ никогда не истечет, и мы используем %no-protection для создания ключа без парольной фразы для простоты (в реальных сценариях вы всегда должны использовать надежную парольную фразу).

Теперь сгенерируйте ключ, используя файл параметров:

gpg --batch --gen-key gen-key-params

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

gpg --list-keys

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

/home/labex/.gnupg/pubring.kbx
-------------------------------
pub   rsa2048 2023-10-27 [SC]
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
uid           [ultimate] LabEx User <user@labex.io>
sub   rsa2048 2023-10-27 [E]

Теперь у вас есть пара ключей GPG, готовая для подписи и шифрования файлов.

Цифровая подпись и проверка файла с помощью GPG

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

Мы создадим "отсоединенную" подпись (detached signature), которая хранится в отдельном файле. Это полезно, поскольку исходный файл остается неизменным.

Чтобы подписать important_data.txt, выполните следующую команду. GPG автоматически использует сгенерированный вами закрытый ключ по умолчанию.

gpg --detach-sign important_data.txt

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

ls

Вы увидите исходный файл и его подпись:

gen-key-params  important_data.txt  important_data.txt.sig

Теперь представьте, что вы получатель, который получил как important_data.txt, так и important_data.txt.sig, а также ваш открытый ключ. Чтобы проверить подлинность и целостность файла, он выполнит команду gpg --verify.

Давайте выполним проверку самостоятельно:

gpg --verify important_data.txt.sig important_data.txt

Вывод подтвердит, что подпись действительна:

gpg: Signature made Mon Aug  4 16:39:30 2025 CST
gpg:                using RSA key 8765265B14E42532B9CBAE6DE2120C9784C69814
gpg: Good signature from "LabEx User <user@labex.io>" [ultimate]

Сообщение "Good signature" подтверждает, что файл подлинный и не был изменен.

Шифрование и дешифрование файла с помощью GPG

На этом шаге вы научитесь шифровать файл для обеспечения конфиденциальности. В отличие от подписи (которая использует ваш закрытый ключ), шифрование файла для кого-то требует его открытого ключа. Получатель затем использует свой закрытый ключ для его расшифровки.

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

Используйте следующую команду для шифрования файла. Флаг --recipient указывает, чей открытый ключ использовать для шифрования, а --output определяет имя зашифрованного файла.

gpg --encrypt --recipient "user@labex.io" --output important_data.txt.gpg important_data.txt

Если вы попытаетесь просмотреть содержимое нового зашифрованного файла important_data.txt.gpg, вы увидите нечитаемые двоичные данные.

cat important_data.txt.gpg

Теперь давайте расшифруем файл. Это действие требует соответствующего закрытого ключа. Поскольку у вас есть закрытый ключ, вы можете расшифровать сообщение. Мы сохраним расшифрованное содержимое в новый файл с именем decrypted_data.txt.

gpg --decrypt --output decrypted_data.txt important_data.txt.gpg

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

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

cat decrypted_data.txt

Вывод должен представлять собой исходное, читаемое сообщение:

This is a secret message that needs to be protected.

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

Резюме

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

  • Вычислили хеши файлов с помощью md5sum и sha256sum для обеспечения целостности данных.
  • Установили и настроили GnuPG (gpg), стандартный инструмент для криптографии с открытым исходным кодом.
  • Сгенерировали персональную пару ключей GPG (открытый и закрытый ключи).
  • Создали цифровую подпись с помощью gpg --detach-sign для обеспечения подлинности и целостности.
  • Проверили цифровую подпись с помощью gpg --verify.
  • Зашифровали файл для конфиденциальности с помощью gpg --encrypt.
  • Расшифровали файл для доступа к его исходному содержимому с помощью gpg --decrypt.

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