Разделение конфиденциальных данных в MongoDB и NodeJS - ссылки через зашифрованный ключ

В настоящее время я работаю над приложением, которое позволяет пользователям сохранять конфиденциальные данные. Так как это веб-приложение, которое мы используем NodeJS а также MongoDB для настойчивости. (Кстати, я совершенно новичок в Node и NoSQL)

У нас есть пользователи, которые могут хранить историю болезни. Имя и адрес электронной почты хранятся в пользовательском документе, а другие данные хранятся в профиле. Для повышения безопасности я бы хотел encrypt ссылки пользователя на его профиль и наоборот.

На данный момент я использую Crypto библиотека NodeJS зашифровать (AES256) user_id ссылка в профиле пользователя. Как следствие, ссылка больше не является типом ObjectID, а является строкой

Поэтому, просматривая базу данных напрямую, невозможно проверить, какой профиль принадлежит какому пользователю. Секретный ключ к encrypt а также decrypt идентификатор пользователя хранится где-то в файле JS NodeJS сервер.

Это обычный / хороший способ или я делаю что-то совершенно не так? Есть ли лучшие способы - я читал, что mongoDB не поддерживает "встроенное шифрование"

По крайней мере, вот код для en / decryption

module.exports = function() {
    this.encryptionSecret = "ANYSECRET";
    this.crypto = require('crypto');
    this.algorithm = 'aes256';
    this.encrypt = function (key) {
        var cipher = this.crypto.createCipher(this.algorithm, this.encryptionSecret);
        var encrypted = cipher.update(""+key, 'utf8', 'hex') + cipher.final('hex');
        return encrypted;
    };
    this.decrypt = function (encryptedKey) {
        var decipher = this.crypto.createDecipher(this.algorithm,     this.encryptionSecret);
        var decrypted = decipher.update(encryptedKey, 'hex', 'utf8') + decipher.final('utf8');
        return decrypted;
    }; 

};

2 ответа

Решение

Давайте посмотрим на риски, с которыми вы сталкиваетесь:

  1. Хакер взломал ваш сервер и украл всю БД. Неудача, в этом случае зашифрованные ссылки не сильно помогут, так как хакер, вероятно, тоже получил доступ к ключу. Даже если вы полностью объедините данные, например, в разные центры обработки данных, и хакер получит только "анонимную" часть данных, эти медицинские записи, вероятно, будут содержать имя, страховку и / или другие идентифицирующие данные. Даже если нет, есть исследования, которые показывают, что практически невозможно анонимизировать данные (примеры: анонимные графы друзей, профили устройств)

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

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

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

Я бы порекомендовал поместить ваш encryptionSecret в переменную окружения.

Другие вопросы по тегам