Прошу не судить слишком строго, всё-таки первая статья на Хабре как-никак :)
Вступление
В этой статье я расскажу, как создать программу для шифрования своих личных данных, с небольшой изюминкой в реализации. Возможно это не так надёжно как полное шифрование диска до загрузки ОС, за то что-то новое.
Представим такую ситуацию: на вашем компьютере хранятся очень важные или компрометирующие вас данные, а в вашу дверь кто-то ломится. Ваша задача заключается в том, что бы быстро и незаметно зашифровать всю важную информацию на своём компьютере.
Для этого понадобится всего-лишь отключить заранее подготовленную флешку (карту памяти) из своего компьютера, после чего программа работавшая до этого в фоновом режиме автоматически начнёт процесс шифрования выделенных данных. Вам остаётся лишь надёжнее спрятать флешку с ключом шифрования)
Реализация
Теперь попытаемся перенести описанную выше программу в реальный мир. В качестве языка программирования я выбрал Python. Во-первых, он удобен для этих целей, а во-вторых, я знаю его лучше всех остальных. Для начала создадим программу для шифрования. Установим библиотеку cryptography:
pip install cryptography
Далее импортируем в нашу программу все необходимые библиотеки:
import os
import sys
from cryptography.fernet import Fernet
После этого создадим переменные с буквой нашей флешки и путём к папке файлы в которой необходимо зашифровать. В моём случае буква диска — E. Так же необходимо написать функцию которая будет проверять, подключена ли флешка к компьютеру или нет. Я долго думал как реализовать эту функцию лучше всего. По итогу пришёл к такому варианту:
drive_letter = "E"
encrypted_path = "C:/Data"
def check_drive(drive_letter):
if os.system("cd " + drive_letter + ":") == 0:
return True
else:
return False
Далее создадим функции создания и чтения ключа шифрования:
def write_key():
key = Fernet.generate_key()
with open(drive_letter + ":/key.txt", "wb") as key_file:
key_file.write(key)
def load_key():
with open(drive_letter + ":/key.txt", "r") as file:
key = file.read()
return key
Как вы видите ключ создаётся и читается именно на диске E:/, то есть на флешке. Это означает что вынув её из компьютера, доступ к зашифрованным файлам останется только у вас.
Так же создадим две функции для шифрования и расшифровки наших файлов. В качестве аргументов они будут принимать имя файла и ключ шифрования.
def encrypt(filename, key): # Шифрование файла
fernet = Fernet(key)
with open(filename, "rb") as file:
file_data = file.read()
encrypted_data = fernet.encrypt(file_data)
with open(filename, "wb") as file:
file.write(encrypted_data)
def decrypt(filename, key): # Расшифровка файла
fernet = Fernet(key)
with open(filename, "rb") as file:
file_data = file.read()
decrypted_data = fernet.decrypt(file_data)
with open(filename, "wb") as file:
file.write(decrypted_data)
Теперь самое интересное. Напишем функцию, с помощью которой наша программа будет перемещаться по директориям и шифровать файлы. Для начала определим список файлов и папок в текущей директории с помощью функции os.listdir(). Дальше пройдёмся по ранее полученному списку и определим тип каждого элемента: файл или папка. Если это файл — шифруем его, если папка — запускаем нашу функцию повторно по новому пути.
def walk(directory):
names = os.listdir(directory)
for name in names:
path = os.path.join(directory, name)
ext = os.path.splitext(path)
if os.path.isfile(path):
encrypt(path, key)
else:
walk(path)
Ну и последний штрих. Если файл key.txt не найден на флешке, создаём его. Далее читаем из него ключ и сохраняем его в переменной key. После создаём бесконечный цикл проверки подключения флешки и если наша программа обнаружит что флешка отключена будет инициализирована функция walk(), в качестве аргумента передаём ей директорию, файлы и папки в которой нужно зашифровать:
if os.path.isfile(drive_letter + ":/key.txt") == False:
write_key()
key = load_key()
else:
key = load_key()
while True:
if not check_drive(drive_letter):
walk(encrypted_path)
print("Encrypted!")
break
Теперь, по похожей логике создадим программу для расшифровки наших данных. Она будет читать ключ из файла key.txt, которых хранится на нашей флешке:
import os
import sys
from cryptography.fernet import Fernet
drive_letter = "E"
decrypted_path = "C:/Data"
def load_key():
with open(drive_letter + ":/key.txt", "r") as file:
key = file.read()
return key
def decrypt(filename, key):
fernet = Fernet(key)
with open(filename, "rb") as file:
file_data = file.read()
decrypted_data = fernet.decrypt(file_data)
with open(filename, "wb") as file:
file.write(decrypted_data)
def walk(directory):
names = os.listdir(directory)
for name in names:
path = os.path.join(directory, name)
ext = os.path.splitext(path)
if os.path.isfile(path):
decrypt(path, key)
else:
walk(path)
key = load_key()
walk(decrypted_path)
Итог
Мы создали две программы: одна работает в скрытом режиме и проверяет подключена ли флешка к компьютеру, в ином случае программа автоматически шифрует выделенные данные, сохраняя ключ шифрования на нашу флешку. Вторая программа необходима для расшифровки этих самых данных с помощью сохранённого ключа на флешке.
Так же, программу можно добавить в автозагрузку, что бы не запускать её каждый раз при запуске компьютера вручную.
Теперь, всё что вам остаётся сделать, так это вставить свою флешку в компьютер, включить программу для шифрования наслаждаться пресловутой безопасностью :-)
Комментарии (34)
jh0ns0n
13.07.2023 12:39+3Очень рискованно, а если флешка выйдет из строя, прощай данные, ключ то уже не прочитать. И ибп желательно иметь, а то ведь могут, перед тем как стучать в дверь, в щитке поковыряться.
dartraiden
13.07.2023 12:39+1Проще использовать условный BitLocker с ключевым файлом на флешке / карте памяти.
Носитель с файлом вполне реально уничтожить (раздолбать молотком чип памяти / проглотить microSD-карточку), пока пилят дверь. И никакое электричество для этого не нужно. Единственное условие — дверь должна открываться наружу и выдержать несколько минут.
Truzme Автор
13.07.2023 12:39Думаю лучше потерять зашифрованные данные, чем они попадут в не те руки. К тому же есть такая же вероятность что и жёсткий диск с данными может полететь. А про ИБП я тоже думал, интересная тема)
vilgeforce
13.07.2023 12:39+3Вы говорите об "экстренном" шифровании, но при этом используете не чистый AES, а некоторую надстройку над ним по имени fernet. Очень беглый гуглинг показывает, что она использует HMAC, который считается по всему шифротексту. Это однозначно будет оказывать влияние на скорость шифрования (не в лучшую сторону), при этом никак не увеличивая стойкость шифрования к прочтению ломящимися в дверь.
Truzme Автор
13.07.2023 12:39Не могу с вами не согласится. Fernet взял из-за лёгкости в понимании, в отличии от других библиотек в которых всё не много сложнее.
OldFisher
13.07.2023 12:39+18Правильно ли я понимаю описанную ситуацию? В дверь стучат, и стремительным движением герой сего повествования запускает процедуру, которую тщательно подготовил заранее, задолго до прискорбного визита. Но при этом подготовка состояла не в том, что он сразу сделал зашифрованный том, а просто настрополил скрипты зашифровать когда-нибудь потом, и теперь дрожит - а успеет ли зашифроваться всё, что нужно, а не перехватят ли? Ну и зачем этот ненадёжный способ, когда можно надёжнее - например, вынуть microSD с зашифрованным диском VeraCrypt и съесть (там на один укус)?
Aelliari
13.07.2023 12:39+3Да, абсурдная логика, необходимо изначально хранить зашифрованные данные. Если хочешь экстренно их уничтожить - уничтожь ключ.
P.S. Сейчас хватает SSD шифрующих данные по умолчанию, пусть 100% доверия к вендорским поделкам тоже нет, но у части из них есть функция «Secure Erase», которая, собственно и убивает ключ шифрования в памяти контроллера SSD
Akina
13.07.2023 12:39+2Для этого понадобится всего-лишь отключить заранее подготовленную флешку (карту памяти) из своего компьютера, после чего программа работавшая до этого в фоновом режиме автоматически начнёт процесс шифрования выделенных данных.
Ага. Прогнозирую. Тот, кто вломился в дверь, в первую очередь вырубает питание компьютера. После чего на диске как минимум из шифруемого файла получается качественно обжаренный фарш. И по закону Великой подлости, это будет единственный критично нужный файл.
А коллекция порнушки так и останется незашифрованной.
Я уж не говорю о том, что те, кто ломится - они сначала бьют по рубильнику, и только потом ломятся. А бесперебойника в коде я как-то не вижу...
aamonster
13.07.2023 12:39+10Крайне странная идея – шифровать при наступлении события, а не хранить изначально зашифрованным, чтобы достаточно было затереть ключ.
anzay911
13.07.2023 12:39+1В комментах уже высказались про проверенные решения, и это верно. А мне вот иногда вспоминается ситуация, когда полиция инсценировала драку в кафе, чтобы завладеть ноутбуком сидевшего там админа хакерского форума, чтобы он не успел заблокировать ничего. Горячие клавиши не нажмёшь, супернадёжный veracrypt не размонтируется. Кроме скрипта с bluetooth ничего в голову не приходит.
BugM
13.07.2023 12:39-1Закрыть крышку ноута это правда так сложно и долго? Да, этого достаточно.
Если ответ да - не открывайте ноут в публичных местах.
splix
13.07.2023 12:39Именно так поймали основателя Silk Road. Инсценировав какие-то действия рядом с его столиком чтобы он повернул голову, и в этот момент с другой стороны выхватили ноутбук что-бы не успел закрыть крышку.
BugM
13.07.2023 12:39+2Тогда один выход - не открывать ноут в публичных местах. В принципе выхватить открытый ноут со стола в месте где люди рядом ходят всегда можно. От этого нет защиты.
9982th
13.07.2023 12:39FaceID?
Serge78rus
13.07.2023 12:39+1После общения с полицией "ключ" к FaceID может измениться настолько, что в итоге сам не сможешь ничего расшифровать.
Kuklachev
13.07.2023 12:39-1Можно хранить том на флешке, а её на ремешке прикрепить к запястью. Ещё можно написать программу для камеры, что если нет лица владельца, то размонтировать том. Еще можно датчик движения использовать. Ну и не шастать по кафе, конечно, хехехе
Aelliari
13.07.2023 12:39+1Два фактора разблокировки, условная «флешка-ключ» и пароль, по наступлению события (флешка покидает порт) - блокировка криптоконтейнера. Флешку - на веревочку, и на браслет/лямку джинсов для ремня.
not-allowed-here
13.07.2023 12:39таймеры... правда задалбывает, но безопасность дороже... еще бывает так что на корпусе есть особое место где стоит датчик Холла... хотя счас можно и El-Marine и Mifare
KivApple
13.07.2023 12:39+1Очень оригинальное решение.
Все решения что я видел до этого предполагают, что данные исходно зашифрованы, а экстренно прячется или уничтожается только ключ (так как он весит несколько десятков байт, это можно сделать почти мгновенно со всеми мерами предосторожности).
В чём преимущество вашего метода? Возможность выпить чаю с ломяшимеся в дверь людьми, пока ждёте окончания процесса шифрования?
Mingun
13.07.2023 12:39Когда ломятся в дверь, руки сразу холодеют. Вот, чтобы немного согреться, нужно чтобы под стулом подгорало — успеет, не успеет?
(Даже какая-никакая, а рифма)
rudnik85
13.07.2023 12:39+2Представим такую ситуацию: на вашем компьютере хранятся очень важные или компрометирующие вас данные, а в вашу дверь кто-то ломится. Ваша задача заключается в том, что бы быстро и незаметно зашифровать всю важную информацию на своём компьютере.
В большинстве стран мира, в том числе и РФ, лучше так не делать, как уже советовали выше, а если пилят дверь, уничтожать все данные и именно ВСЕ, без возможности восстановления каким либо ключом, ибо терморектальный способ получения информации ни кто не отменял, а если ничего не найдут, кроме сломанного-спаленного носителя, посадят на полиграф и если тот покажет, что вы врёте и где то есть ещё инфа, к примеру в облаке, снова терморектальный метод...
not-allowed-here
13.07.2023 12:39+1а смысл?
данный которые существуют с любой криптографией будет расшифрованы - ВСЕГДА. и да за вполне конечное время. обычно время до начала расшифровки занимает от 45 минут в зависимости от опытности допрашивающего и того на сколько угрожающе выглядит методика прикладного криптоанализа.....
даже если данные уже не существуют их вполне можно найти ли в бекапах или в остатках на дисках - только физическое и полное разрушение носителей - причем всмятку - восстановление данных услуга платная дорогая но вполне в масштабах бюджетов органов.... у многих есть и свои отделы которые вполне на уровне
даже если вы уничтожили носители не факт что органы уже не имеют копии всех важных для дела данных..... хакеры есть и у них то же плюс возможность легального MITM.....
Kuklachev
13.07.2023 12:39-1Недооценивать органы не стоит, но и преувеличивать их возможности тоже не нужно. Далеко не всегда практикуется термоанализ. Я бы предположил, что в современных реалиях это как раз редкость. Адвокаты, видеосъемка в учреждениях и т.п. все таки не очень способствует. Да и возможности по восстановлению тоже не надо преувеличивать. У меня к примеру один ssd диск накрылся. И оказалось, что данные за полгода почему-то не были забэкаплены. Обращался в разные организации по восстановлению, помочь не смогли.
not-allowed-here
13.07.2023 12:39+1прикладной криптоанализ может включать демонстрацию неприглядных фактов, длительного нахождения в местах не столь отдаленных.... и много чего еще..... реально методы термоанализа практический и не применялись никогда, но правильная атмосфера антураж и профессиональная работа специалиста с профильным психологическим рулят....
насчет восстановления тут вопрос уровня повреждений если - диск массовый то данные вполне легко выдираются если что то редко и уникальное то тут могут быть тонкости....
DimoniXo
13.07.2023 12:39Пользуясь случаем. А нет ли для Android реализаций подобных сценариев. Например, при вводе определённого пин кода на заблокированном экране происходит форматирование data
garwall
13.07.2023 12:39краткая инструкция, "как написать самому себе ransomware."
качество работы наверное, примерно такое же. вот например, эти пайтоновские файловызовы для операционной системы это "шифропоток пишется в новый файл, тот сохраняется и подставляется на место старого файла" или "переписывается на диске байтовый поток"? А то в первом случае, я полагаю, все ваши ценные файлы можно будет простым анделетером повытаскивать.
BugM
Никогда не пишите криптографию самостоятельно. Вообще никогда. Используйте массовые, проверенные решения. Их достаточно на любой вкус.
Работа с файловой системой тоже не так проста. Разнообразные симлинки доставляют много радости.
vilgeforce
Даже если не брать в расчет симлинки и прочее веселье, наивный подход "открыть-прочитать-записать-закрыть" показывает далеко не лучшую производительность. Плохие парни, которые хотят шифровать максимально быстро, уже много лет используют всякие зубодробительные WinAPI про CompletionPort. Но это сложно писать и отлаживать...
freeExec
Особенно на питоне
Flux
Поддерживаю. Доверьте это профессионалам - они знают своё дело. Они и код более качественный напишут, и константы правильные подберут.
Shaman_RSHU
И бекдоры встроят (шутка). Если серьезно, то лучше конечно использовать проверенные временем и людьми алгоритмы.
freeExec
Он и не пишет криптографию сам а взял какой-то fernet
Truzme Автор
Во-первых, я не писал криптографический алгоритм самостоятельно, а взял уже готовую библиотеку Fernet. Во-вторых, я не позиционирую это решение как профессиональное, это больше экзотика, за то оригинально и интересно, возможно нужно было заранее упомянуть об этом в статье. А про обычное шифрование диска BitLocker'ом все и так знают.