Разделение конфиденциальных данных в 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 ответа
Давайте посмотрим на риски, с которыми вы сталкиваетесь:
Хакер взломал ваш сервер и украл всю БД. Неудача, в этом случае зашифрованные ссылки не сильно помогут, так как хакер, вероятно, тоже получил доступ к ключу. Даже если вы полностью объедините данные, например, в разные центры обработки данных, и хакер получит только "анонимную" часть данных, эти медицинские записи, вероятно, будут содержать имя, страховку и / или другие идентифицирующие данные. Даже если нет, есть исследования, которые показывают, что практически невозможно анонимизировать данные (примеры: анонимные графы друзей, профили устройств)
Хакер взломает ваш сайт и получит доступ к данным за пределами своей учетной записи. Поскольку ваш сервер должен иметь возможность обрабатывать логику разыменования и иметь доступ к обоим хранилищам данных для выполнения своих обязанностей, этот метод вообще не повысит безопасность. Однако, поскольку вы используете совершенно новую для вас серверную технологию, шансы на наличие дыр в безопасности вашего программного обеспечения высоки...
Сбой диска, и вы теряете часть данных или ключ. В этом случае у вас будет больше работы, чем восстановление по аналогичному сценарию без зашифрованных ссылок.
Обеспечение безопасности веб-приложений сводится к полутора возможностям: либо сделать саму систему максимально надежной, используя стандарты безопасного кодирования, тесты на проникновение, предотвращение вторжений, двухфакторную аутентификацию и т. Д., И т. Д., И / или использовать шифрование на стороне клиента. Последнее выглядит как абсолютное оружие, но чревато своими опасностями. Боюсь, что нет серебряной пули [о которой я могу думать].
Я бы порекомендовал поместить ваш encryptionSecret в переменную окружения.