Я понимаю, что это зависит от моей реализации и реализации библиотек, которые я использую. Я спрашиваю о своем процессе, предполагая, что библиотеки шифрования и мой код не повреждены/скомпрометированы, пароль пользователя защищен и машина не скомпрометирована.
Цель здесь состоит в том, чтобы защитить конфиденциальность файлов с помощью пароля и иметь возможность зашифровать их без ввода пароля.
Начальная настройка:
- Создать пару ключей RSA
- Запрашивать у пользователя пароль и предполагать, что он использует достаточно безопасный пароль.
- Зашифровать закрытый ключ в формате DER, pkcs=8, схема = scryptAndAES256-CBC с паролем пользователя
Для каждого файла:
- Сгенерировать случайный сеансовый ключ размером 32 байта
- Зашифровать ключ сеанса с помощью начального открытого ключа
- Создать случайный одноразовый номер из 12 байтов
- Запись в выходной файл:
- Зашифрованный сеансовый ключ
- одноразовый
- Зашифрованный файловый поток с помощью AES GCM с использованием случайного сеансового ключа 32 байт и одноразового номера 12 байт.
При расшифровке файла
- Запрашивать у пользователя пароль, расшифровывать начальный закрытый ключ
- Чтение зашифрованного сессионного ключа и одноразового номера с начала файла
- Расшифровать сеансовый ключ с помощью начального закрытого ключа
- Расшифровать файловый поток с помощью сеансового ключа и одноразового номера.
Единственное, что следует отметить, это то, что я выбрал GCM из-за его скорости, а не, например, CBC. Я также знаю о проблеме коллизий при использовании случайного одноразового номера, однако я понимаю, что это было бы проблемой, если бы у меня были миллиарды файлов, использующих один и тот же сеансовый ключ. И с 32-байтовым случайным ключом у меня в основном есть 44 байта пространства, чтобы избежать коллизии. Мне желательно, чтобы не приходилось отслеживать одноразовый номер.
Есть ли какие-либо проблемы с этим планом или это будет безопасный способ защитить конфиденциальность файлов, предполагая, что псевдокод был правильно реализован?