【问题标题】:Sensitive Data separation within MongoDB and NodeJS - references via encrypted keyMongoDB 和 NodeJS 中的敏感数据分离 - 通过加密密钥进行引用
【发布时间】:2013-08-07 15:02:24
【问题描述】:

我目前正在开发一个允许用户保存敏感日期的应用程序。由于它是一个 Web 应用程序,我们使用 NodeJSMongoDB 进行持久化。 (顺便说一句,我对 Node 和 NoSQL 完全陌生)

我们确实有可以存储某种病史的用户。姓名和电子邮件存储在用户文档中,而其他内容存储在配置文件中。 为了提高安全性,我想encrypt 用户对其个人资料的引用,反之亦然。

目前我正在使用NodeJSCrypto 库来加密(AES256)用户配置文件中的user_id 引用。因此,引用不再是 ObjectID 的类型,而是字符串

因此,通过直接查看数据库,无法检查哪个配置文件属于哪个用户。 encryptdecrypt 的用户 ID 的密钥存储在 NodeJS 服务器的 js 文件中的某个位置。

这是一种常见/好方法还是我做错了什么?有没有更好的方法——我读到 mongoDB 不支持任何“内置加密”

至少,这里是加密/解密的代码

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;
    }; 

};

【问题讨论】:

  • “什么”是常用的方式吗?在源代码中存储密钥?这当然不理想,但是您会发现密钥管理很困难,并且需要将其存储在某个配置文件中,由帐户加密等。您“保护”数据的技术似乎很弱(如研究已经表明,即使是从半匿名数据中识别患者也是相对简单的,在这种情况下,您所做的只是加密参考,而不是数据)。
  • 首先,非常感谢您@WiredPrairie 的回答!您对如何提高安全性/数据匿名化有什么建议吗?如果保持数据本身加密不是最好的方法,那么还有什么替代方法?
  • 感谢您的模块。效果很好。可以通过构造函数传入秘密,使其更加灵活。

标签: node.js mongodb encryption sensitive-data


【解决方案1】:

我建议将您的 encryptionSecret 放在 environment variable 中。

【讨论】:

  • 那么服务器被黑客入侵的场景(在回答中提到)呢?环境变量很容易访问(例如printenv)。那么钥匙就不安全了。
  • 我想如果你的服务器被黑了,那么你就不走运了。不仅您的环境变量可以轻松访问,而且您的应用程序可以访问的所有内容都对黑客可用。 --- 我不认为你的服务器被黑客入侵是人们防御的常见情况。他们通常只是从一开始就保护自己免受黑客攻击,但一旦黑客已经进入,他们就不会。
【解决方案2】:

让我们来看看您面临的风险:

  1. 黑客闯入您的服务器并窃取了整个数据库。 运气不好,在这种情况下,加密引用无济于事,因为黑客也可能获得了密钥的访问权限.即使您完全联合数据,例如到不同的数据中心,并且黑客只获取数据的“匿名”部分,这些医疗记录可能包含姓名、保险和/或其他识别数据。即使不是,也有研究表明几乎不可能对数据进行匿名处理(例如:匿名好友图、设备配置文件)

  2. 黑客入侵了您的网站并访问了他帐户之外的数据因为您的服务器必须能够处理取消引用逻辑并且必须能够访问两个数据存储才能执行其职责,这种方法根本不会增加安全性。但是,由于您使用的是全新的服务器技术,因此您的软件中存在安全漏洞的可能性很高...

  3. 磁盘崩溃,您丢失了部分数据或密钥在这种情况下,与从没有加密引用的类似情况中恢复相比,您需要做更多的工作。 p>

使网络应用程序安全归结为一种半可能性:要么通过使用安全编码标准、渗透测试、入侵预防、双因素身份验证等,使系统本身尽可能健壮。和/或使用客户端加密。后者看起来像是终极武器,但也充满了危险。恐怕没有[我能想到的]灵丹妙药。

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多