我想将 bcrypt.compare 与 mongoose/mongo 引擎搜索一起使用

I want to use bcrypt.compare together with mongoose/mongo enginee search

考虑这段代码:

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({})获取所有数据库信息,然后应用ForEachbcrypt.compare,尽管如此,我从我的研究中得知 mongo 针对搜索进行了优化,例如他们使用索引。如果能够将 bcrypt.compare 作为 自定义函数 传递给 mongo 搜索引擎,那就太好了。

有人建议 "Increase the bcrypt salt rounds.":我不能使用 salt 因为那会改变密钥,每当我需要比较时,它就会改变。 bcrypt.compare存在以克服这一点,但 mongo/mongoose 查询没有这样的内部引擎。

我头脑中的伪代码:

Model.findOne({bcrypt.compare (internalID, internalID')}) //return when true

其中:bcrypt.compare (internalID, internalID') 将是一种回调函数,在每次搜索时,mongo 将此函数与 internalID' 一起使用,当前 internalID 比较下,而 return 产生的文件是 true.

有任何建议、评论或其他内容吗?

PS。我正在使用 mongoose.

据我了解,您永远不想让任何人知道患者 ID(无法从现实生活中的患者 ID 中发现),甚至是数据库管理员(当然还有黑客)。 我觉得你的设计有点乱。 首先 - 索引使用 B 树数据结构进行更快的查找,因此您必须提供准确的字符串进行查找,并且根据您的不可散列 ID 的条件,索引将不起作用。因此,您必须遍历该医生的每个患者 ID 并进行比较以获得真实结果,这是相当多的计算量并且坦率地说是糟糕的设计。 有多种方法可以解决这个问题——取决于你的信任程度和偏执程度。

我认为使用 cryptojs 是正确的解决方案。现在你必须给 key/solution 添加一些随机性。基本上你用 cryptojs 散列 id,但不是自己提供密钥,你可以从 doctor 本身获取密钥,然后用该密钥散列每个 id。现在,每次医生更改密钥(使用某种消息队列)时,您都必须取消散列和散列每个患者 ID。 您还可以在保存之前对医生输入的密钥进行哈希处理,并且每次(两次!)医生想要通过 patientId 查找时都必须取消哈希处理。

取决于您希望您的应用程序服务的用户数量,如果数量足够少,我的解决方案将起作用。但是用户太多,您将不得不增加计算资源并且可能投资于一些安全措施而不是我的矫枉过正的解决方案。无论如何,您为什么要将密钥丢失给黑客?

祝你好运。