Какой лучший способ зашифровать и сохранить текст в базе данных MongoDB?

Вопрос или проблема

У меня есть “облачный сервис”, который состоит из 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: Безопасное хранение ключей шифрования

Ключи шифрования должны храниться в безопасном месте. Рассмотрите следующие методы:

  1. Секреты облачных провайдеров: Используйте такие решения, как AWS Secrets Manager или Azure Key Vault, для управления доступом к ключам.
  2. Шифрование ключа: Вы можете шифровать ключи с помощью другого ключа и хранить их в конфигурации вашего приложения или в среде исполнения.
  3. Создание ключа на стороне сервера: Генерируйте ключи на серверной стороне и никогда не храните их в открытом виде.

Шаг 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, функция, позволяющая шифровать данные в приложении перед их отправкой в базу данных, сохраняя возможность выполнения запросов к зашифрованным данным. Это может быть полезно, если планируется высоконагруженное приложение с необходимостью частого поиска.

Тем не менее, используйте эту функцию с осторожностью. Следует учитывать возможность использования уязвимостей, связанных с управлением ключами и их сильной зависимостью от правильной конфигурации.

Заключение

При реализации шифрования данных необходимо учитывать не только выбор надежного алгоритма, но и безопасность ключей, структурирование данных в базе и ограничения прав доступа. Интеграция предложенных методов не только повысит защиту ваших данных, но и улучшит общую безопасность вашего приложения.

Оцените материал
Добавить комментарий

Капча загружается...