Сегодня мы поговорим о шифровании данных, как правильно зашифровать данные. Я также расскажу о программе под названием GPG. Это одна из самых популярных программ для шифрования ваших данных. Я покажу на практике, как шифровать данные и как правильно ими пользоваться и как создавать ключи.
Симметричное и асимметричное шифрование
Для начала нужно понимать, что бывает два вида шифрования — Симметричное и асимметричное.
- Симметричное шифрование использует один и тот же ключ и для зашифровывания, и для расшифровывания.
- Асимметричное шифрование использует два разных ключа: один для зашифровывания (который также называется открытым или публичным), другой для расшифровывания (называется закрытым или приватным).
Эти методы решают конкретные проблемы и имеют как преимущества, так и недостатки. Конкретный выбор используемого метода будет зависеть от целей, для которых информация шифруется.
Симметричное шифрование.
В симметричных криптосистемах алгоритм и ключ выбираются заранее и известны обеим сторонам. Хранение ключа в секрете — важная задача при установлении и поддержании безопасного канала связи. В связи с этим возникает проблема первичной передачи ключа (синхронизации ключей).
Симметричные, а точнее, буквенные алгоритмы шифрования были одними из первых алгоритмов. Позже было изобретено асимметричное шифрование, при котором ключи собеседников разные.
Самые популярные алгоритмы: AES, Blowfish, Twofish.
Недостатки:
Недостатки симметричного шифрования — проблема передачи ключа собеседнику и невозможность установить подлинность или авторство текста. Так, например, технология цифровой подписи основана на асимметричных схемах. Кроме того, алгоритм симметричного шифрования можно считать достаточно хорошо разработанным и эффективным, с минимальным количеством недостатков, особенно в контексте асимметричной криптографии.
Достоинства:
- скорость
- простота реализации (за счёт более простых операций)
- меньшая требуемая длина ключа для сопоставимой стойкости
- изученность (за счёт большего возраста)
Асимметричное шифрование.
Преимущество этого типа шифрования заключается в том, что вы можете предоставить свой открытый ключ через незащищенный канал. Так как этим ключом человек может только что-то зашифровать. Но он не сможет расшифровать. Криптографические системы с открытым ключом широко используются в нескольких сетевых протоколах: TLS, SSL, HTTPS, SSH, PGP. Первым недостатком асимметричной криптографии является низкая скорость операций криптографии и дешифрования, что связано с необходимостью обработки ресурсоемких операций.Как следствие, требования к оборудованию такой системы часто неприемлемы. В общем, принцип асимметричного шифрования можно очень просто выразить одной фразой: «Вы можете сгенерировать пару очень больших чисел, так что, зная одно, будет невозможно вычислить другое за разумное время. Причем механизм генерации общеизвестен. «Все асимметричные алгоритмы можно описать очень кратко. Должно быть только одно свойство. Если x известен, то вычислить f (x) несложно. Если y = f (x) известно, то нет простого способа вычислить x. Один из самых популярных алгоритмов — алгоритм RSA.
RSA (Алгоритм работы)
Алгоритм работает довольно просто. Мы просто берем два простых числа P
и Q
.
Умножим их друг на друга и в результате получим N
. Потом выберем случайное число D
. Оно должно быть взаимно простым с (P-1)*(Q-1)
. И определим число E
, для которого будет истиной (E*D) mod ((P-1)*(Q-1))=1
И у нас открытый ключ это числа E
и N
, а приватный — числа D
и N
Теперь, чтоб нам зашифровать что-нибудь нашим открытым ключом {E,N}
нам надо разбить наш шифруемый текст на блоки, каждый из которых можно представить в виде числа M(I)=0,1,2..., N-1
И зашифровать, как последовательность M(I)
по формуле C(I)=(M(I)^e)mod N
. А чтобы потом расшифровать это, просто используем секретный ключ {D,N}
, по формуле M(I) = (C(I)^D) mod N
В результате получим исходный текст.
Практика.
Для начала давайте установим саму программу:
sudo apt install gpg
sudo добавляется когда вы сидите на из под rootа, а под обычной учёткой.
apt это приложение которое ищет то что вам нужно установить.
install это установить.
gpg это приложение которое вам нужно установить.
gpg это именно та утилита и тот инструментарий который мы будем использовать для шифрования наших данных.
После того как программа установилась нам нужно будет сгенерировать ключи шифрования при помощи которых мы будем всё шифровать:
gpg --full-gen-key
Первое, что у нас спрашивается, это то какие алгоритмы шифрования мы хотим использовать, давайте будем использовать RSA, это классический алгоритм который как раз для таких целей и используется. Жмём 1:
По умолчанию у нас длина ключа 3072 бита. Ставим максимальную длину ключа 4096 бит. Чем большую длину ключа мы ставим тем дольше у нас будет происходить шифрование и дешифрование, но при этом это более безопасно. Если у вас более менее мощный компьютер, то рекомендую ставить 4096 бит. В любом случае это достаточно быстро если вы не шифруете десятки или сотни гигабайт:
Далее нужно установить время жизни ключа. Мы сделаем ключ бессрочный:
Программа спрашивает всё ли правильно мы указали. Пишем: y
Это означает Yes (Да).
Затем программа запрашивает наше имя и адрес электронной почты. Прежде всего, это необходимо для подписи данных. Теперь мы говорим о шифровании данных, подписи — это отдельная история для разработчиков программного обеспечения, и так далее, в данном случае они нам не нужны. Поэтому здесь вы можете указать все, что хотите, случайный емайл и имя, комментарий тоже абсолютно любой:
Программа опять уточнит всё ли правильно. Да всё правильно жмём: o.
Хорошо. Теперь откроется окно, в котором появится пароль. Будьте здесь очень осторожны и найдите надежный пароль не менее 30-40 символов, этот пароль будет использоваться для доступа к нашим данным, пароль должен быть очень сложным и длинным. Лично для моего ключа длина пароля превышает 100 символов, и я его запомнил. Пароль не заменяет ключи; это дополнительный механизм дополнительной защиты наших данных. Все будет безоговорочно зашифровано с использованием длинных и сложных ключей шифрования, но помимо этого есть еще и пароль. Придумаем пароль и подтвердим его:
Я показываю вам в качестве примера. Поэтому длинный пароль тут делать себе не буду.
Начался процесс генерации ключа. В процессе генерации выполняйте какие-то другие действия (печать на клавиатуре, движения мыши, это даст генератору случайных чисел больше возможностей получить достаточное количество энтропии).
Всё. У нас сгенерировались ключи и теперь мы их собственно можем посмотреть и начать с ними работать.
Давайте посмотрим наши публичные ключи:
gpg -k
У нас показывается публичный ключ. Вот он у нас публичный ключ:
И тамже ниже у нас будет ещё показан 1 публичный ключ который называется sub ключём:
Sub ключ это некий подключ, то есть у нас есть основной ключ pub и есть sub ключ. Если мы говорим про шифрование файлов, то мы используем gpg просто для шифрования файлов, можно не заморачиваться со всей это историей, она здесь нам в этом контексте не нужна. Если мы хотим использовать gpg для подписи данных, мы хотим там debian пакеты например публиковать в репозиториях как разработчик, то здесь уже нужно разбираться с ключами, как их отзывать, как их постить на сервера и так далее. Нам это сейчас здесь всё не нужно.
Таким образом мы тут видим 2 публичных ключа.
Теперь пропишем:
gpg -K
-K большая
Здесь у нас уже будут приватные ключи
И вот они у нас тут:
secret
ssb
Это 2 приватных ключа.
Мы уже сгенерировали 2 ключа и мы можем использовать их для шифрования наших данных.
Давайте теперь перейдём в директорию tmp:
cd /tmp
cd это команда для перехода в нужную директорию (папку)
Создадим в ней текстовый файлик:
echo это команда для создания текстового файла.
«Пароли от серверов Пентагона» текст который будет в файле.
> /tmp/secretik.txt путь где будет создан файл и его название
Проверим создался ли наш файл:
Команда ls показывает все объекты в текущем каталоге (папке) в котором мы сейчас находимся
Как видим он успешно создан. Давайте теперь с вами его зашифруем:
gpg -e -a -r alina@gmail.com secretik.txt
-e означает encrypt, то есть зашифровать файл.
-a это означает в ask формате сохранить результат, не в бинарнике, а в ask, потому что по умолчанию gpg всё шифрует и результат бинарный. С бинарником работать не всегда удобно. Ask текст удобно куда-то его переслать, сохранить, поэтому часто шифруют и выходной результат сохраняют просто как ask текст, как просто обычные символы которые можно открыть в любом текстовом редакторе.
-r это указание ключа которым мы будем шифровать. Здесь же мы можем указать просто email нашего ключа, либо idшник того ключа которым мы хотим зашифровать. В данном случае я просто укажу email и вот этими ключами мы будем шифровать.
secretik.txt тот файл который мы хотим зашифровать.
Проверяем:
ls
И вот у нас создался второй файлик: secretik.txt.asc
Давайте посмотрим, что написано в нашем незашифрованном файле:
vim secretik.txt.asc
vim это текстовый редактор для вывода содержимого файла на экран терминала и его последующего редактирования
И вот пожалуйста:
То есть у нас на входе была строчка: «Пароли от серверов Пентагона».
А на выходе вот такая вот замечательная билеберда. Всё зашифровалось успешно.
Давайте попробуем расшифровать всю эту историю. Для начала удалим оригинальный файл без шифровки:
rm secretik.txt
rm команда для удаления файла. И сразу же проверим командой ls. Как видим он удалился.
Теперь расшифруем наш оставшийся зашифрованный файл:
gpg -d -o secretikdva.txt secretik.txt.asc
-d означает decrypt
-o это выходной файл. Сохраним его в secretikdva.txt например
secretik.txt.asc собственно тот файл который мы расшифровываем
gpg
сразу же нашла наши ключи и просит ввести пароль для расшифровки:
Так как ключи находятся на нашем компьютере, то соответственно gpg программа их нашла и подтянула.
Проверяем: ls
Как видим у нас появился расшифрованный файлик.
cat file.txt
Команда cat показывает то что написано в текстовом файле.
Все успешно расшифровали и все работает. Это означает, что для расшифровки нам нужны и ключи, и пароли. Если есть ключи, но нет пароля, ничего работать не будет. Если есть пароль, но нет ключей, тоже ничего не получится. Это конечно очень хорошо.
Мы зашифровали наши файлы, сгенерировали ключи. Все хорошо и красиво, но ключи ведь можно потерять. Хотелось бы как-то надежно их хранить. Поскольку теперь вы, вероятно, не знаете где они здесь хранятся, gpg их сгенерировал и где-то сохранил.
Мы зашифровали файлы, а затем поместили их, например, в облако и даже сбросили эти зашифрованные файлы на USB-накопитель, и у нас есть ключи на этом компьютере. Это опасно, потому что компьютер может сломаться, сгореть, потеряться, его могут украсть, может случиться еще что-то. Если наши данные настолько ценны, что мы не хотим их терять, ключи нужно где-то заархивировать. Конечно, gpg позволяет нам экспортировать открытые и закрытые ключи только в файл, резервную копию которого можно скопировать куда угодно, а затем повторно импортировать в gpg и использовать полностью. Как работает вся эта история:
Для начала давайте удалим наш расшифрованный и зашифрованный файл из директории, чтобы они нам не мешали. Как это сделать командой rm смотрите выше.
Теперь давайте экспортируем наши ключи:
gpg --export alina@gmail.com > public.gpg
gpg —export это экспорт публичных ключей
Давайте его выведем:
cat publik.gpg
Но я советую экспортировать в aske, чтобы не было такой жёсткой белеберды как выше.
Для этого добавляем интерпритатор -a:
gpg --export -a alina@gmail.com > public.gpg
Теперь всё более читаемо.
Эта команда экспортирует публичные ключи для указанной связки ключей.
Давайте экспортируем теперь приватные ключи:
gpg --export-secret-key -a alina@gmail.com > secret.gpg
Вводим пароль далее. Потом проверяем ls
Всё. Вот эти 2 файлика:
Вы можете скопировать на флешку и закопать эту флешку где-нибудь в огороде, чтобы никто её не нашёл. С компьютера ключи можем далее удалить.
Ещё раз:
gpg -k
это публичные ключи.
gpg -K
это приватные ключи.
Они лежат в директории ~/.gnupg/
ls ~/.gnupg/
Все ключи лежат в домашней директории в данном разделе. Соответственно давайте удалим их отсюда:
gpg --delete-secret-keys alina@gmail.com
Это удаление публичных ключей. Тут попросит подтвердить всего 1 раз.
Теперь давайте проверим:
gpg -k
Как видите ничего нет. Ключи с компьютера мы удалили и у нас их больше нет. Но помните, что у нас хранятся те 2 зашифрованных файлика с ключами? Которые мы предварительно спрятали куда-то на флешку.
Давайте мы их импортируем на компьютер обратно для того чтобы воспользоваться.
gpg --import public.gpg
gpg --import secret.gpg
И смотрим:
gpg -k
gpg -K
Таким образом, мы можем как импортировать, так и экспортировать наши ключи. Это означает, что мы сгенерировали ключи, зашифровали наши данные, экспортировали ключи, сохранили их где-нибудь на USB-накопителе, и в случае чего мы можем импортировать их на любой другой компьютер.
С шифрованием файлов более менее разобрались.
Как вы сейчас работаете с паролями? В конце концов, вы должны серьезно относиться к своей безопасности, и у каждой службы должен быть свой пароль не менее 30-40 символов. Как их всех запомнить?
Фактически, с помощью gpg можно работать и с паролями. Для этого есть отличная утилита pass, которая так же работает на основе gpg. То есть, по сути, pass — это просто сценарий bash. Абсолютно простой и не очень большой, вы можете увидеть его код, что в нем написано, все работает на основе gpg. То есть это всего лишь небольшое упрощение работы с паролями в контексте gpg, это менеджер паролей, который использует gpg для шифрования данных.
Давайте мы с вами его установим
sudo apt install -y pass
Давайте теперь посмотрим куда у нас установился pass:
which команда для поиска файлов в системе
vim /usr/bin/pass
Можете открыть его исходный код и покопаться посмотреть если интересно, простенький bash скрипт на 700 строк.
Но вернёмся к теме. Давайте проинициализируем хранилище наших паролей. Сюда нужно передать idшник ключа который мы будем использовать для шифрования паролей, в данном случае я просто указываю всю связку ключей через прикреплённую почту:
pass init alina@gmail.com
Посмотрим, что в ней:
ls -la ~/.password-store
-l и -а это интерпретаторы, можно написать слитно -la
-l покажет подробный список файлов
-a покажет нам скрытые файлы, то есть перед которыми стоит точка (.)
Первые буквы или символы слева, d означает директория (папка), символ минус (-) означает что это файл.
Я также добавлю, что вам не нужно выполнять cd чтобы перейти в сам каталог и просмотреть его содержимое, это можно сделать из любой точки системы с помощью ls, а затем вам нужно указать полный путь и добавить интерпретаторы, если они вам нужны.
Видим файл .gpg-id с которым мы можем работать. Pass работает таким образом что каждый пароль хранится в отдельном файле. Мы можем на самом деле любую структуру сделать, но удобнее хранить пароли в отдельном файле. Например, давайте сохраним пароль на gmail:
pass insert Email/gmail.com
Далее вас попросит ввести пароль который вы хотите сохранить туда, вводим 2 раза и подтверждаем, далее пароль сохранится в наш файлик.
Посмотрим что получилось:
pass
Мы видим, что у нас появилась и хранится теперь одна запись в нашем хранилище паролей, в директории Email хранится запись gmail.com. На самом деле это реальная директория, это реальный файл. Давайте посмотрим:
tree ~/.password-store
tree это специальная утилита которая выводит всё дерево директорий (папок) и файлов внутри указанной директории.
Как видим у нас есть директория Email и внутри есть файлик gmail.com.gpg
Давайте посмотрим его содержимое:
cat ~/.password-store/Email/gmail.com.gpg
Зашифрованная бинарная билиберда
Как же мы можем его посмотреть теперь нормально в расшифрованном виде?
А посмотреть мы его можем следующим образом:
pass Email/gmail.com
Далее у нас попросит ввести пароль от gpg.
Увидим свой пароль после введения пароля расшифровки gpg
Также кому интересно можете почитать документацию от утилиты pass:
pass --help | less
Там всё написано, документация коротенькая, но полная. Всё что можно сделать при помощи pass там есть.
Я покажу ещё очень хорошую штуку, давайте сделаем так:
pass insert Social/vk -m
-m это называется мультилайн, то есть несколько строк можно хранить в этом зашифрованном хранилище. Не просто пароль, а прям текстовый файл и можем писать туда любой текст.
То есть мы создаём новую директорию паролей. Например социльные/vk. Вы можете придумать и создать любые категории которые вам нужны.
Теперь мы можем ввести туда ту информацию которую хотим сохранить:
Пишем что нам нужно, вставляем перенос строки и жмём Ctrl+D
Как видим всё удачно сохранилось
В общем, вы можете использовать это для хранения некоторых банковских реквизитов и так далее. Просто текстовый файл, который будет зашифрован надежными и хорошими ключами gpg, но, конечно же, важно, чтобы ваш пароль, который вы вводите, также должен быть очень длинным и надежным.
Также pass умеет генерировать пароль. Давайте попробуем сгенерировать:
pass generate Email/mail.ru 30
30 это указание длины пароля, тут можно поставить любое число которое вам нужно. Это очень удобно если вам лень составлять его самом или не можете придумать хороший и надёжный пароль сами.
После генерации автоматически создаётся директория с нашим паролем. Далее мы можем например установить его на наш email или куда вам нужно.
Также мы можем удалять наши сохранённые пароли:
pass rm Email/mail.ru
Как видим всё удалилось
Заключение
Вы знаете, что произойдет, если вы потеряете свой ноутбук, а его найдет плохой человек? Он включит его с любой загрузочной флешки и легко получит доступ ко всем вашим данным. Поэтому очень важно зашифровать весь диск. Чтобы, когда вы потеряете свое устройство, никто не сможет получить к нему доступ. Для этого при установке Kali Linux выберите disk encryption lvm, там будет такой пункт (нужно будет придумать очень сложный пароль для шифрования жесткого диска не менее 40-50 символов и держать этот пароль в голове ). Не используйте легкие пароли: пароли, которые могут быть связаны с вами или найдены в словаре, можно легко подобрать с помощью перебора.