【问题标题】:Cancel a password hashed with pbkdf2取消使用 pbkdf2 散列的密码
【发布时间】:2016-12-17 21:53:54
【问题描述】:

我正在使用 pbkdf2 算法来散列密码。 为每个密码生成一个随机盐,并设置迭代次数 为了使计算持续大约 1 秒。

我还在 sambe 缓冲区中保存盐和哈希:

   -----------------------
   | SaltLen |     4     |
   -----------------------
   | Salt    | saltBytes |
   -----------------------
   | HashLen |     4     |
   -----------------------
   | Salt    | hashBytes |
   - ---------------------

我的问题是这个散列密码没有链接到一个用户(一个用户可以有多个密码),我需要有可能只使用密码本身来取消密码。 我看到的唯一方法是哈希密码以取消数据库中的每个盐,直到找到相同的哈希,这将永远需要(每个盐 1 秒)。

有没有更好的方法?

【问题讨论】:

  • “取消密码”是什么意思?
  • 在这种情况下,密码是许可证,我想将其标记为已取消
  • 您将需要某种标识符来首先查找该行。例如一个从 1、2、3 开始的 64 位整数。如果需要,您可以将其附加到密码的开头,但它将是未散列的形式。
  • 我编辑了问题以使其更清晰。我现在采用的解决方案是为每个用户而不是每个密码使用盐。
  • 我发现我需要做的是每个用户都有一个盐,而不是每个密码一个盐,否则我无法从登录链接到匹配的盐。 :)

标签: security hash pbkdf2


【解决方案1】:

将许可证视为密码是没有意义的。

PBKDF2 和迭代仅对客户端的检查有意义。在服务器端,它们只允许对您的服务器执行 DOS 攻击。无论如何,在服务器上,您只需为每个请求添加 1 秒的延迟即可。

您不必对它们进行哈希处理,因为只有数据库中的许可证才被认为是有效的。入侵您的服务器并窃取它们没有任何意义。

要检查正确的许可证条目,您只需将许可证的数据库条目 ID 添加到许可证本身,并且您确切知道要检查的条目。

【讨论】:

  • 但是如果我想生成将发送给有大约 3 个月时间激活它们的客户的许可证,我该怎么办。如果有人入侵我的网站,他可以获得有效的许可证,他可以代替真正的客户使用。
  • 您在问题中提出的数据库仅在软件直接联系服务器以验证许可证时才有意义。如果你的设计不同,你的问题给人一种错误的印象。如果您需要离线可验证的许可证,请使用非对称加密并签署您的许可证、许可证名称和到期日期。
猜你喜欢
  • 1970-01-01
  • 2020-10-05
  • 2020-02-29
  • 2017-12-26
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
相关资源
最近更新 更多