Вопрос или проблема
Я работаю над обновлением метода шифрования класса на работе. Методы шифрования и расшифровки принимают текст для шифрования/расшифровки и строку, которая раньше использовалась в качестве соли (эта строка закодирована в вызовах метода во многих местах по всему коду).
Мой план — безопасно сгенерировать случайную 16-байтную соль, затем использовать scrypt
для получения 64-байтного массива из соли и строки (которую я теперь рассматриваю как пароль, так как она больше не используется в качестве соли).
Затем я разделю этот массив на два 32-байтных ключа и использую первый для шифрования текста с помощью AES-GCM. Затем я использую второй ключ для шифрования первого и добавляю зашифрованный ключ и соль к зашифрованному тексту.
При расшифровке я заново сгенерирую оба ключа, используя соль, добавленную к зашифрованному тексту, расшифрую ключ, добавленный к зашифрованному тексту, и сравню его с сгенерированным ключом. Если они совпадают, то я расшифрую текст и верну его.
Получаю ли я какие-либо преимущества, используя два ключа таким образом, или было бы так же хорошо получить один ключ из соли и пароля и просто добавить соль к зашифрованному тексту?
Есть ли какая-то польза в шифровании производного ключа?
На самом деле нет.
Кроме того, общая схема кажется странной идеей и немного запутанной. Кажется, вы изменяете схему шифрования/расшифровки так, чтобы пароль был немного более запутанным. Но было бы лучше просто сделать пароль секретным… так как пароль должен быть секретным. Есть ли причина, по которой пароль не может быть просто защищенным секретом?
Кроме того, предполагается ли, что “соль” будет выполнять роль вектора инициализации (IV)?
Ответ или решение
Вопрос об обоснованности шифрования производного ключа вызывает множество обсуждений среди экспертов в области информационных технологий и криптографии. Прежде чем приступить к ответу, важно рассмотреть основные аспекты вашей задачи обновления метода шифрования, чтобы понять, приведет ли шифрование производного ключа к реальным преимуществам.
1. Понимание задачи
Вы планируете изменить подход к шифрованию, используя scrypt
для генерации производного ключа из пароля (который в вашем случае используется как соль) и новой, случайно сгенерированной соли. Основная идея заключается в том, чтобы создать два ключа из производного массива байтов: первый будет использоваться для шифрования текста с помощью AES-GCM, а второй предназначен для шифрования первого ключа.
2. Преимущества шифрования производного ключа
Теперь перейдем к самой сути вопроса: приносит ли шифрование производного ключа какие-либо значимые преимущества?
Защита ключа
Возможные выгоды:
- Дополнительный уровень безопасности: Если злоумышленнику удастся получить доступ к шифрованному тексту, наличие шифрованного ключа затрудняет его работу, так как он не сможет сразу использовать ключ для расшифровки.
- Изоляция ключей: Разделение шифрования основного текста и ключа может предоставить более гибкий контроль над процессом расшифровки и уменьшить последствия компрометации одного из компонентов.
Однако:
- Шифрование производного ключа не является стандартной практикой в большинстве криптографических систем и может не предоставить значимых преимуществ в вашем случае, особенно если ключ по-прежнему зависит от пароля.
3. Сложности и недостатки
Усложнение архитектуры
- Сложности с реализацией: Добавление дополнительного уровня шифрования для производного ключа усложняет процесс шифрования и расшифрования. Это может привести к большему количеству ошибок при реализации и проверке кода, что снижает устойчивость вашей системы к уязвимостям.
- Проблемы производительности: Сложность алгоритмов может сказаться на общей производительности шифрования, особенно если приложение должно обрабатывать большие объемы данных.
4. Альтернативные подходы
Вместо шифрования производного ключа, возможно, стоит рассмотреть другие стратегии, такие как:
- Хранение пароля в защищённом виде: Полное исключение явного использования пароля в коде (даже как соль). Это может включать использование хранилищ секретов и управление доступом для защиты внутренних данных.
- Подход с использованием общей соли: Если вы используете соль в контексте
scrypt
, подумайте о более безопасной реализации, где соль уникальна для каждого экземпляра шифрования, что трудно помочь создавать предсказуемую структуру.
5. Заключение
Ответ на вопрос о целесообразности шифрования производного ключа зависит от требуемой безопасности и архитектуры вашего приложения. Основная цель шифрования — это защита данных, и если шифрование производного ключа не добавляет значительной сложности в обработку или безопасность, его стоит рассмотреть как потенциально без необходимости увеличивать уровень сложности.
Варианты, такие как правильное обращение с паролем и уникальными солями, могут быть более разумными и безопасными решениями в рамках вашей новой схемы шифрования.