【问题标题】:Authentication using random digits in the password使用密码中的随机数字进行身份验证
【发布时间】:2014-02-18 17:01:16
【问题描述】:

这个问题更多的是一个设计知识,而不是一个纯粹的技术问题。

我想知道实现身份验证机制的最佳方式是什么,要求用户在整个密码中的特定位置输入/选择字符。前任。要求用户输入/选择第 3、5、9 个字符,然后检查他们是否从原始密码中输入/选择了正确的字符。

据我所知,密码在存储之前会使用不可逆算法进行加盐和加密。当用户输入他的整个密码时,它会再次被加盐、加密并与存储的值进行比较。但在上述仅输入/选择某些字符的情况下,如何检查整个密码?

以下是我知道的两种(不安全)实现上述方法的方法

  • 将原始密码分解为单个字符,然后 加盐和加密它们。然后比较用户输入的值 针对特定角色。
  • 将原始密码分解为预定义的组合,如第 2、3 和 7 个字符,然后加盐和 加密它们。稍后与用户输入的值进行比较。

但我认为通过上述实现,破解密码比破解整体加密的密码更容易。

最安全的实施方式是什么?


更新: 刚刚发现这个话题已经在here进行了详细的讨论,并且提到了使用HSM和对称加密。

【问题讨论】:

  • 感觉是让人们发疯/远离您的应用/网站的绝佳方式。你试过自己做吗? (我的意思是你需要多长时间才能输入密码的第 8 个字符 - 不要写下来,不要打字)......
  • 最安全/最好的实现方式?不。需要考虑的事情:通过要求输入 3/5/9 个字符作为密码,您实际上是将他们的密码减少到三个字符。
  • @AlexeiLevenkov 我同意,它对用户不友好。但显然英国的大多数银行网站都采用了这种机制,我只是想知道它是如何工作/实现的。

标签: c# java authentication encryption passwords


【解决方案1】:

将密码分解成黑客可以独立攻击的不同部分可以显着降低密码的整体复杂性。本质上,您允许黑客使用密码玩“20 个问题”:“单独的数字是 500 吗?不,750 怎么样?”

此外,绝大多数典型应用用户会发现这项任务困难、具有挑战性和烦人。

我不建议这样做。

您是正确的,通常存储加盐的 散列(未加密)密码。如果您是散列而不是加密,则需要一些机制来分别知道密码的那些特定数字是什么。您应该进行加盐/散列。一些知名网站因为使用了加密而导致许多用户帐户被盗,而加密密钥被黑客发现了。

【讨论】:

    【解决方案2】:

    通过这样做,您可以降低密码给您的熵。以 8 个字符的密码为例。现在让我们假设您的密码是随机选择的,我们试图通过尝试每种组合来强制使用它。这个公式是 (n+r-1!)/r!(n-1)!对于 8 个字符 (r=8)(大小写和数字 n=(26*2+10))的含义,您的所有组合都会产生 8361453670 不同的组合。

    现在让我们说,您要求他们给您第 1、第 3 和第 6 个字符,您有效地将选择 (r) 的数量减少到 3,因为要强制每个组合,我只需要 3 个字符。您现在拥有的组合总数是 41664,这很容易破解。事实上,这不会花时间。

    你永远不应该减少你的熵,事实上我建议密码至少包含 10 个字符,包含字母数字和符号。

    关于“不可逆加密”的问题,您指的是散列。密码应该以散列和加盐存储,实际上它们应该使用慢速散列,如 BCrypt、SCrypt 或 PBKDF2。但是为了能够做到你所说的,你将需要使用可逆加密来加密密码。这是一个禁忌,因为密钥可能会被盗,在这种情况下,您的密码也可能是纯文本形式。

    存储密码的最佳方法是不存储它们(如果可以,请使用 open id 或其他东西,这样您就不必承担责任)。存储密码的第二个最佳方法是将它们存储起来,就好像您将要丢失它们一样。 Salted+Hashed 使用非常慢的算法,让您有足够的时间来警告您的用户并给他们足够的时间来更改他们的密码。

    【讨论】:

      【解决方案3】:

      密码通常以加密格式存储。它使用特定的盐进行加密。 salt 告诉加密算法一些初始化向量。这种加密是一种方式。没办法解密。

      这样构建一个彩虹密码表是非常困难的,因为你也需要对每个盐组合都这样做。请参阅以下 WIKI..http://en.wikipedia.org/wiki/Rainbow_table

      您提出的方法会严重降低您从良好密码中获得的安全性。

      【讨论】:

      • -1 密码通常encrypted 形式存储。散列,但未加密。 (而且你的答案大多重复现有的......)
      猜你喜欢
      • 2020-02-28
      • 2011-11-14
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 2014-04-29
      相关资源
      最近更新 更多