我目前正在开发一个允许用户保存敏感日期的应用程序。由于它是一个Web应用程序,因此我们使用NodeJS
和MongoDB
来保持持久性。 (顺便说一句,我是Node和NoSQL的新手)
我们确实有用户可以存储某种病史。名称和电子邮件存储在用户文档中,而其他内容存储在配置文件中。
为了提高安全性,我希望encrypt
用户对其个人资料的引用,反之亦然。
目前,我正使用Crypto
NodeJS
库加密(AES256)用户个人资料中的user_id
引用。因此,引用不再是ObjectID的类型,而是字符串
因此,通过直接查看数据库,无法检查哪个配置文件属于哪个用户。 encrypt
和decrypt
用户ID的密钥存储在NodeJS
服务器的js文件中。
这是一种常见/好的方式还是我做错了什么?有没有更好的方法 - 我读到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;
};
};
答案 0 :(得分:4)
让我们来看看你面临的风险:
黑客闯入您的服务器并窃取整个数据库。运气不好,在这种情况下,加密引用也无济于事,因为黑客也可能访问密钥。即使您完全联合数据,例如对于不同的数据中心,黑客只获取数据的“匿名”部分,这些医疗记录可能包含姓名,保险和/或其他识别数据。即使没有,也有研究表明,几乎不可能对数据进行匿名化(例如:匿名的朋友图,设备配置文件)
黑客入侵您的网站并访问其帐户以外的数据由于您的服务器必须能够处理取消引用逻辑,并且必须能够访问这两个数据存储来执行其责任,这种方法根本不会增加安全性。但是,由于您使用的是对您来说完全陌生的服务器技术,因此在您的软件中出现安全漏洞的可能性很高......
磁盘崩溃并丢失部分数据或密钥在这种情况下,除了从没有加密引用的类似方案中恢复之外,还有更多工作要做。
使Web应用程序安全可归结为一半的可能性:通过使用安全编码标准,渗透测试,入侵防御,双因素身份验证等,使系统本身尽可能健壮。和/或使用客户端加密。后者看起来像是终极武器,但却充满了自己的危险。我担心没有银弹[我能想到]。
答案 1 :(得分:1)
我建议将您的encryptionSecret放在environment variable中。