MongoDB和NodeJS中的敏感数据分离 – 通过encryption密钥引用

我目前正在研究一个允许用户保存敏感date的应用程序。 由于它是一个Web应用程序,我们正在使用NodeJSMongoDB进行持久化。 (顺便说一下,我对Node和NoSQL是全新的)

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

目前,我正在使用NodeJSCrypto库在用户configuration文件中encryption(AES256) user_id引用。 因此,引用不再是一种ObjectID,而是一个string

所以通过直接查看数据库,不可能检查哪个configuration属于哪个用户。 encryptdecrypt用户id的秘密密钥存储在NodeJS服务器的js文件的某处。

这是一种常见的/好的方法,还是我在做一些完全错误的事情? 有没有更好的方法 – 我读mongoDB不支持任何“内置encryption”

至less,这是en /解密的代码

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

};

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

  1. 黑客入侵你的服务器并窃取整个数据库。 运气不好,在这种情况下,encryption引用也不会有什么帮助,因为黑客也可能访问密钥。 即使您将数据完全联合到不同的数据中心,黑客也只能获得“匿名”的数据部分,这些病历可能包含名称,保险和/或其他识别数据。 即使没有,也有研究表明匿名数据几乎是不可能的(例如:匿名的朋友图,设备configuration文件)

  2. 黑客入侵您的网站并获取他账户以外的数据由于您的服务器必须能够处理去引用逻辑,并且必须能够访问这两个数据存储区以履行其职责,所以这种方法根本不会增加安全性。 但是,由于您使用的服务器技术对您而言是全新的,所以软件中存在安全漏洞的可能性很高。

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

使Web应用程序的安全性归结为一个半的可能性:通过使用安全编码标准,渗透testing,入侵防御,双因素authentication等等,或者使系统本身尽可能健壮使用客户端encryption。 后者看起来像是终极武器,却充满了自己的危险。 恐怕没有银弹(我能想到)。

我会build议把你的encryptionSecret放在一个环境variables中 。

Interesting Posts