- Вопрос или проблема
- Ответ или решение
- Оптимальные методы шифрования и хранения текста в базе данных MongoDB
- Шаг 1: Выбор алгоритма шифрования
- Шаг 2: Использование Web Crypto API
- Шаг 3: Безопасное хранение ключей шифрования
- Шаг 4: Хранение зашифрованных данных в MongoDB
- Шаг 5: Разграничение прав доступа
- Шаг 6: MongoDB Queryable Encryption
- Заключение
Вопрос или проблема
У меня есть “облачный сервис”, который состоит из 2 частей:
- Веб-приложение, написанное на Next.js;
- База данных MongoDB (использует MongoDB Atlas).
Я позволяю пользователям входить с помощью GitHub и обрабатываю аутентификацию с использованием JWT. Пользователь может создавать и удалять текстовые файлы, которые сохраняются в базе данных следующим образом:
{
"name": string,
"content": string,
"owner": number <-- ID пользователя
}
Я хотел бы зашифровать content
, чтобы не видеть его в базе данных. Я думал о том, чтобы использовать Web Crypto API, но не уверен, как надёжно сохранить ключ шифрования/расшифровки.
Какой лучший способ решить эту задачу и какой алгоритм шифрования мне использовать?
Объявлено 7 июня 2022:
Queryable Encryption — это функция, которая позволяет вам шифровать данные в
вашем приложении перед отправкой их по сети в MongoDB, при этом
сохраняя возможность запроса зашифрованных данных. При
включении Queryable Encryption никакая управляемая служба MongoDB не имеет доступа к
вашим данным в незашифрованном виде.
https://www.wired.com/story/mongodb-queryable-encryption-databases
https://www.mongodb.com/blog/post/mongodb-releases-queryable-encryption-preview
Но предупреждение @Маркуса Мюллера заставляет меня быть скептически настроенным.
Ответ или решение
Оптимальные методы шифрования и хранения текста в базе данных MongoDB
Ваша задача по шифрованию содержимого текстовых файлов, хранимых в базе данных MongoDB, требует внимательного подхода к выбору алгоритма шифрования, а также безопасного хранения ключей шифрования. Данная статья соберет лучшие практики, улучшая общую безопасность вашего приложения.
Шаг 1: Выбор алгоритма шифрования
Для шифрования текста рекомендуется использовать симметричные алгоритмы, такие как AES (Advanced Encryption Standard) с длиной ключа не менее 256 бит. Это обеспечит высокий уровень безопасности ваших данных:
- AES-256: является стандартом шифрования, рекомендованным для большинства приложений, требующих надежности и скорости.
- Обратите внимание на режим шифрования. Для защиты от атак выберите режим, такой как GCM (Galois/Counter Mode), который обеспечивает как конфиденциальность, так и целостность данных.
Шаг 2: Использование Web Crypto API
Вы можете интегрировать Web Crypto API для шифрования данных непосредственно в вашем приложении на Next.js. Это позволит шифровать контент до отправки его в MongoDB:
async function encryptData(content, encryptionKey) {
const iv = window.crypto.getRandomValues(new Uint8Array(12)); // Генерация IV
const encodedContent = new TextEncoder().encode(content);
const encryptedContent = await window.crypto.subtle.encrypt(
{
name: "AES-GCM",
iv: iv,
},
encryptionKey,
encodedContent
);
return { iv: Array.from(iv), content: Array.from(new Uint8Array(encryptedContent)) };
}
Шаг 3: Безопасное хранение ключей шифрования
Ключи шифрования должны храниться в безопасном месте. Рассмотрите следующие методы:
- Секреты облачных провайдеров: Используйте такие решения, как AWS Secrets Manager или Azure Key Vault, для управления доступом к ключам.
- Шифрование ключа: Вы можете шифровать ключи с помощью другого ключа и хранить их в конфигурации вашего приложения или в среде исполнения.
- Создание ключа на стороне сервера: Генерируйте ключи на серверной стороне и никогда не храните их в открытом виде.
Шаг 4: Хранение зашифрованных данных в MongoDB
При сохранении зашифрованного содержимого в MongoDB, вам нужно будет структуру документа сохранить так, чтобы она оставляла место для хранения как зашифрованных данных, так и виртуального вектора (IV):
{
"name": "example.txt",
"content": {
"iv": [/* IV Values */],
"data": [/* Encrypted Data Values */]
},
"owner": 123
}
Шаг 5: Разграничение прав доступа
Убедитесь, что права доступа к зашифрованным данным ограничены и доступны только авторизованным пользователям. Используйте JWT (JSON Web Tokens) для обеспечения безопасной аутентификации пользователей.
Шаг 6: MongoDB Queryable Encryption
MongoDB анонсировала поддержку Queryable Encryption, функция, позволяющая шифровать данные в приложении перед их отправкой в базу данных, сохраняя возможность выполнения запросов к зашифрованным данным. Это может быть полезно, если планируется высоконагруженное приложение с необходимостью частого поиска.
Тем не менее, используйте эту функцию с осторожностью. Следует учитывать возможность использования уязвимостей, связанных с управлением ключами и их сильной зависимостью от правильной конфигурации.
Заключение
При реализации шифрования данных необходимо учитывать не только выбор надежного алгоритма, но и безопасность ключей, структурирование данных в базе и ограничения прав доступа. Интеграция предложенных методов не только повысит защиту ваших данных, но и улучшит общую безопасность вашего приложения.