На работе мне, как "нутыжеучишьсявунивере", поручили сделать небольшую программу для хранения строковых данных, которые сейчас лежат в блокноте. Данные нужно защитить, но у меня нет опыта в криптографии. ChatGPT посоветовал использовать Python и библиотеку AES, но мне это кажется сомнительным. Я планирую, что программа будет работать на ПК без сети и при сохранении будет делить запись на две части: одну часть — в файл на ПК, вторую часть и инструкцию по воссоединению — на флешку, чтобы без флешки данные было затруднительно или невозможно восстановить. Насколько безопасен такой подход и какие простые, надёжные варианты защиты вы бы порекомендовали реализовать с минимальными знаниями в криптографии?
Коротко: разделять файл на «части» и хранить их в разных местах — это не криптозащита, это безопасность через неизвестность. Если злоумышленник найдёт обе части и знает способ сборки или сумеет подобрать его (а чаще сможет), данные будут доступны. Гораздо надёжнее — воспользоваться проверёнными средствами шифрования и правильным хранением ключа/пароля.
Ниже — понятный, надёжный и реализуемый при минимальных знаниях план + конкретные варианты.
1) Сформулируйте угрозу (важно)
- Кто атакует: случайный пользователь ПК / коллега / профессионал?
- Что атакуется: диск ПК (физический доступ), флешка, если ПК заражён вредом?
- Требования: возможность восстановить данные при потере флешки, сколько копий и т. п.
2) Главное правило
- Не придумывайте собственные криптосхемы (разбиение на части, XOR, собственные алгоритмы) — используйте проверенные библиотеки/инструменты (GnuPG, VeraCrypt, libsodium/cryptography).
3) Простые надёжные варианты (от самого простого до более гибких)
Вариант A — самое простое (рекомендуем если нужно быстро и без программирования)
- Используйте GPG (OpenPGP) для симметричного шифрования:
gpg --symmetric --cipher-algo AES256 файл.txt
Вам будет предложено пароль. Храните пароль на флешке (или запомните). GPG — проверенный инструмент, даёт аутентификацию и шифрование.
Вариант B — контейнер/том (если хотите скрыть много файлов)
- VeraCrypt (или BitLocker / LUKS на уровне ОС) — создаёте зашифрованный контейнер/том на флешке или на ПК. Надёжно, удобно, не нужно самому реализовывать крипто.
Вариант C — в вашей программе (Python) — используйте проверенные библиотеки
- Библиотека cryptography (Fernet) — очень простая, включает аутентифицированное шифрование:
from cryptography.fernet import Fernet
key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(b"секрет")
f.decrypt(token)
- Если хотите пароль вместо ключа — используйте KDF (scrypt/Argon2/PBKDF2) и AES-GCM или Fernet. Ниже пример с scrypt + AESGCM.
Пример (Python, требуются: pip install cryptography):
```
from cryptography.hazmat.primitives.kdf.scrypt import Scrypt
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os, json, base64
def derive_key(password: bytes, salt: bytes):
kdf = Scrypt(salt=salt, length=32, n=2**14, r=8, p=1)
return kdf.derive(password)
def encrypt(plaintext: bytes, password: str):
salt = os.urandom(16)
key = derive_key(password.encode(), salt)
aesgcm = AESGCM(key)
nonce = os.urandom(12)
ct = aesgcm.encrypt(nonce, plaintext, None)
# сохраняем salt, nonce и ciphertext вместе (например, JSON или бинарно)
return base64.b64encode(json.dumps({
"salt": base64.b64encode(salt).decode(),
"nonce": base64.b64encode(nonce).decode(),
"ct": base64.b64encode(ct).decode()
}).encode())
def decrypt(blob_b64: bytes, password: str):
data = json.loads(base64.b64decode(blob_b64))
salt = base64.b64decode(data["salt"])
nonce = base64.b64decode(data["nonce"])
ct = base64.b64decode(data["ct"])
key = derive_key(password.encode(), salt)
return AESGCM(key).decrypt(nonce, ct, None)
```
Пара замечаний: KDF параметры (n, r, p) выбирайте так, чтобы derivation занимал ~100–500 мс на целевой машине. Лучше использовать Argon2 (пакеты есть) или scrypt с хорошими параметрами.
4) Где хранить ключ/пароль
- Лучшее решение: храните зашифрованные данные на ПК, а ключ/пароль — отдельно (на флешке или в голове). При этом:
- Хранить ключ в открытом виде на той же машине бессмысленно.
- Если храните файл-ключ на флешке — шифруйте саму флешку или защищайте её физически (флешка легко теряется).
- Можно хранить пароль в менеджере паролей (KeePass, Bitwarden) и резервную копию в безопасном месте.
5) Почему простое "разделение файла пополам" опасно
- Если атака целенаправленная, найти алгоритм разделения и восстановить данные несложно.
- Даже если вы XOR-ите части — необходима правильная генерация ключей/случайных данных; если это не выполнено, безопасность нулевая.
- Существуют способы восстановления фрагментов с диска (оригинальные данные могут остаться в кэше или в «тенях» файловой системы).
6) Дополнительные практические советы
- Всегда используйте аутентифицированное шифрование (AES-GCM, ChaCha20-Poly1305, Fernet). Нужен MAC, чтобы обнаружить подмену.
- Делайте резервные копии ключей/флешек (если потеряете ключ — данные утрачены).
- Права доступа к файлам/каталогам и обновления ОС/антивирус — важны.
- Не храните пароль в коде или в репозитории.
- Не пытайтесь «ускорить» KDF для удобства — чем слабее KDF, тем проще брутфорс.
7) Что я рекомендую вам сделать прямо сейчас (минимум усилий, максимум безопасности)
- Если нужно быстро: зашифруйте файл через GPG и храните пароль на флешке (или запишите на бумаге в сейф).
- Если хотите написать программу: используйте cryptography.Fernet или AESGCM + scrypt/Argon2 как в примере. Храните ciphertext на ПК, ключ/пароль — на флешке/в голове.
- Подумайте о VeraCrypt, если у вас много файлов или удобство использования важно.
Если хотите, могу:
- Подготовить маленькую готовую утилиту на Python (шаги: encrypt/decrypt, хранение salt/nonce) с инструкцией по развёртыванию.
- Или дать шаги для настройки GnuPG/Veracrypt под вашу ОС (Windows/Linux).
Скажете, что удобнее — напишу код или пошаговую инструкцию под вашу ОС.
<blockquote><br/> По идее, эти данные нуждаются в защите и ввиду отсутствия какого-либо опыта в криптографии, я не знаю что делать.<br/> </blockquote> <br/> По какой идее? Что это за данные и откуда взялись требования по шифрованию? <br/> Что ещё с ними нужно кроме хранения? <br/> Сколько их? <br/> <br/> Если это какие-то пароли, то можно использовать уже готовый менеджер паролей. <br/> <br/> <blockquote><br/> А мне кажется это сомнительно и вот что я думаю:<br/> Подразумевается работа программы на пк без сети, я хочу чтобы при записи данных они делились пополам - полбайта в файл на пк, полбайта и инструкция как соеденить - на флешку.<br/> </blockquote> <br/> Это иллюзия безопасности, не надо так. <br/> <br/> Лучше тогда уж зашифровать каким-нибудь сильным алгоритмом типа AES, а на флешку положить ключ (но тогда наверное стоит задуматься об использовании специального ключевого носителя) <br/> Но надо подумать, как происходит работа с этими данными, а то если их много, то целиком всё расшифровывать и защифровывать обратно будет слишком тяжело. А при применении блочных схем есть риск создать дыру.
Делали похожее, просто Fernet из <code>cryptography</code> , это AES под капотом. Идея с разделением файла красивая но по факту обфускация, ломается элементарно. Если хочешь привязку к флешке, клади на неё файл с ключом шифрования, а шифрованные данные на пк. Только бекап ключа сделай, флешка сдохнет — данные потеряешь. ChatGPT тут не соврал)
Мда, сделай те мне то, что я не знаю что. <br/> Максимум что я понял из твоего задания, что нужно предоставлять доступ к данным если человек владеет флешкой. Самое лучшее это aes ключ на флехе. <br/> Но тут надо быть уверенным что машина при виыкаеии флешки не скопрометированна. Желательно это должен быть отдельный мини ПК (хотяты ардуино, которое у себя на плате расшифрования данные, беря зашифрованные из ПК.) ну жто уже совсем паранойя
<b>Никогда</b> не изобретай своей криптографии! Если ты конечно не Ривест, Шамир и Адлеман в одном лице :) Берешь rsa, ключ 2048 - и шифруешь. На флэшку ключ (учти - утеря ключа - утеря данных!). Все.
Безопасность не абстрактная вещь и не может быть реализована только программными средствами. Безопасность это точно не криптография, хотя она будет использоваться под капотом, вам нужно комплексное програмно-аппаратное решение плюс регламенты. <br/> <br/> Так как вы ничего не сказали про вашу задачу, задавать наводящие вопросы это долго, я придумаю ответы за вас, и дам выжимку: <br/> <br/> Вам нужна <b>аутентификация</b> пользователя, т.е. надежный способ идентифицировать пользователя, что бы в приложении можно было выбрать ( <b>авторизация</b> ), что пользователю доступно или к примеру блокировать доступ при его отзыве. <br/> <br/> Вам нужна минимальная защита компроментации рабочего места, в зависимости от типа компроментации будет выбираться способ аутентификации и аппаратные решения. <br/> <br/> Например если у вас с гарантией рабочее место защищено (обыски при входе в помещение, видеонаблюдение, личная ответственность и т.п.) то может хватить и пароля или пассивной карты доступа, в т.ч. на базе тупого qr/bar-кода + пинкод. Недостатки подхода - пароли или карты с qr-кодом нужно часто менять (интервал времени меньше чем время для доступа к рабочему месту после приема на работу/проверки службой безопасности, что бы злоумышленник, сначала скопировав карту доступа, не поступил на работу и не получил бы доступ к рабочему месту). <br/> <br/> Более сложный и надежный способ - не пассивное устройство с чипом шифрования (карта доступа или usb токен), в этом случае для компроментации доступа нужна физическая кража устройства или проксируемый доступ снаружи и физический доступ с подменой карт ридера на рабочем месте (обламывается регламентами, обысками и слежкой). <br/> <br/> Я рекомендую не пассивный usb токен авторизации, на базе FIDO2 (CTAP2) USB‑ключа (есть карты но тогда нужно покупать еще и ридер), библиотеки есть по до все, например открытая libfido2, стоимость токена порядка 1-2т.р. (может есть дешевле при оптовых покупках). В приложении заложить логику, ввода пин кода (с экрана, что бы усложнить компроментацию, а то с клавиатурой это не сложно) при вставке, и поддерживать доступ к приложению и данным только пока устройство подключено. <br/> <br/> Токен будет позволять выдавать ключ шифрования и защищает его от копирования при его краже. Управление правами доступа (добавление или отзыв доступа) при оффлайн работе приложения придется делать на нем же (т.е. администратор использует свой ключ доступа, авторизуясь, получает у приложения доступ на управление списками доступа и регистрацию новых ключей).