【发布时间】:2020-07-31 19:55:54
【问题描述】:
考虑这段代码:
const hashPassword = function(plainText) {
return crypto
.createHmac(process.env.Secret_hash_Password, "secret key")
.update(plainText)
.digest("hex");
};
您可能已经注意到,这是一个使用crypto 的简单散列函数。
现在考虑这段代码摘录:
bcrypt.compare(password, user.password, (err, isMatch) => {....}
您可能已经注意到,这是一个使用bcryptjs 的简单比较散列函数。
我相信每个人都会同意,第二个是最安全的。
现在考虑问题:
我有一个密钥要存储在 mongo 上,这个密钥是敏感信息,所以我决定对它进行哈希处理,这样就没有人可以解密它了。 这个密钥用于制作mongo 搜索,这是只有用户拥有的信息,一种密码。
解决方案:使用第一个代码,虽然不能解密,但如果输入相同,则可以得到相同的哈希结果。
问题:我的解决方案是使用一种众所周知的容易被黑客入侵的技术,以某种方式可以访问服务器的人只需要输入几个输入,一旦他们得到相同的输出,他们明白了!这是我的解决方案的一个众所周知的缺陷。
所需的解决方案:将第二个代码与 mongo 一起使用。
讨论:我可以简单地使用find({}) 获取所有数据库信息,然后申请ForEach 和bcrypt.compare,尽管如此,我从研究中知道mongo 针对搜索进行了优化,例如他们使用索引。如果能够将bcrypt.compare 作为自定义函数传递给 mongo 搜索引擎,那就太好了。
有人建议“增加 bcrypt 盐循环。”:我不能使用盐,因为这会改变密钥,每当我需要比较时,它就会改变。 bcrypt.compareexists 可以克服这个问题,但是 mongo/mongoose 查询没有这样的内部引擎。
我脑子里的东西,用伪代码写的:
Model.findOne({bcrypt.compare (internalID, internalID')}) //return when true
其中:bcrypt.compare(internalID, internalID') 将是一种回调函数,在每次搜索时,mongo 将使用此函数与 internalID',当前的 internalID 进行比较,并返回产生的文档真的。
有什么建议、意见或任何事情吗?
PS。我正在使用猫鼬。
【问题讨论】:
-
> 您关心的问题:问题:我的解决方案是使用一种众所周知的容易被黑客入侵的技术,有人只需要输入几个输入,一旦他们得到相同的输出,他们就明白了!这是我的解决方案中的一个众所周知的缺陷。 > 潜在解决方案:增加 bcrypt 盐轮。
-
这就是问题所在:我不能使用盐,因为在这种情况下,我将没有相同的密钥。每当我使用
find()或任何其他函数时,我都需要提供一个与数据库中的密钥相同的密钥:bcrypt.compare不需要知道密钥,但与 mongo/mongoose 相关的查询需要。想象一下每次我想寻找它改变的id?这是行不通的。感谢您的回复! -
你能告诉我们你的架构吗?
-
嘿,代码很大,包括模式,如果我添加代码就会产生问题。我会看看我是否发布一个简短的版本,但我相信我所说的已经足够了。我的代码有效,我只是想改进。
-
是您试图与用户数据一起存储在 mongo 中的某种会话密钥(因为它来自客户端)?还是用户访问存储在其他集合中的数据的某种密码?
标签: mongodb encryption mongoose bcrypt cryptojs