首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按散列值搜索

按散列值搜索
EN

Security用户
提问于 2020-10-02 15:01:33
回答 1查看 211关注 0票数 0

我想设计一个REST端点(POST),它接受请求主体中的一些敏感标识符信息:

代码语言:javascript
复制
{
   "someDataToSearch": "abcdefgh"
}

然后,我希望散列abcdefgh,并在我们的数据库中搜索该哈希,并返回相应的实体,在此之前,该实体将作为某些业务逻辑的一部分生成并存储在DB中。

我想用Bcrypt来做这件事,但是我已经意识到需要一个盐来生成,我们不会把盐作为上面请求体的一部分。所以我不认为我们可以用它来查找,如果我错了,纠正我?

什么是安全的算法和方法来做到这一点?谢谢

EN

回答 1

Security用户

发布于 2020-10-02 16:18:55

基于您的评论,为了简单起见,我将假设您要搜索的输入是一个密码。

因此,您不希望将原始密码存储在数据库中,因此您将存储数据库的密码散列。现在,您希望能够在本专栏中搜索。这就产生了一些问题:

  1. 你只能进行精确匹配的搜索。显然,在通过加密散列运行该值之后,无法执行部分匹配搜索。
  2. 为密码设计的哈希函数都需要一个salt和一个工作因素,这使得它们非常慢,使用大量内存,或者两者兼而有之。这两种方法都不适合数据库查找。

解决方案将取决于对所需和不需要的安全属性进行更深入的分析。

  • 如果输入是敏感的,但熵很高(例如私钥),那么您就不需要密码散列函数,因为输入无论如何都不是蛮力的,而且可以使用SHA-256的一次传递。快不加盐。
  • 我想您已经考虑过使用Id或键进行搜索了,不管出于什么原因,这都是行不通的。(您可能需要一种查找给定条目的密钥的方法,在这种情况下,您将回到相同的问题上)
  • 如果您的输入是低熵(就像密码),并且确实需要一个盐渍和迭代散列,那么我看不到任何好的选项,因为您需要一些方法来知道在您能够进行散列和查找之前使用哪种盐类。这种鸡和蛋需要某种Id/密钥(或者用盐作为Id/密钥)。

退一步看,这看起来有点像密码验证:用户用他们的密码登录,服务器查找他们,并为他们返回一堆数据。这里的关键点是,没有系统使用密码作为查找密钥;这就是用户名的用途!提供这个秘密只是为了证明他们是他们所说的那种人。

我同意@Steffen的观点,这似乎是一个XY问题。你可能陷入了死胡同,因为你想要解决的更大的问题不符合我们知道如何有效解决的问题。这可能是回到绘图板的时间,看看你是否可以重新铸造你的问题,以便它符合一些既定的模式。

票数 2
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/239106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档