4

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

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

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

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

这是一种常见/好方法还是我做错了什么?有没有更好的方法——我读到 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;
    }; 

};

4

2 回答 2

4

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

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

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

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

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

于 2013-08-07T07:10:44.413 回答
1

我建议将您的 encryptionSecret 放在环境变量中。

于 2013-11-16T08:19:13.833 回答