【问题标题】:Partial Password Verification部分密码验证
【发布时间】:2015-09-20 23:42:43
【问题描述】:

我希望能够询问用户名,检索用户密码,然后从密码中随机选择 3 个字符并要求对这些字符进行验证。基本上就像银行一样。

我找不到这方面的任何示例,我已经设置了身份验证程序 -

 Public Function IsAuthenticated(ByVal domain As String, ByVal username As String, ByVal pwd As String) As Boolean
    Dim UserAuthenticated As Boolean = False

    If SafeString(username) And SafeString(pwd) Then
        'Is user authenticated in active directory


            Dim domainAndUsername As String = domain & "\" & username
            Dim entry As DirectoryEntry = New DirectoryEntry("", domainAndUsername, pwd)
            Dim search As DirectorySearcher = New DirectorySearcher(entry)
            search.Filter = "(SAMAccountName=" & username & ")"

            Dim result As SearchResult = search.FindOne()
            Dim obj As Object = entry.NativeObject
            UserAuthenticated = True

谁有例子

【问题讨论】:

  • 我不明白。你为什么要这样做?
  • 为包含公司数据的系统增加了安全性。人们访问客户和使用未知计算机并意外点击“记住密码”的高风险
  • 好的。所以当你写“检索用户密码”时,你的意思是 UI 中的那个,对吧?它没有保存在服务器端?你真的应该看看this,因为保存的密码很容易找到。
  • 这并没有停止使用键盘记录器。部分密码验证系统会更安全。

标签: vb.net security passwords verification


【解决方案1】:

您似乎正在针对 Active Directory 后端进行身份验证。 AD 不提供任何验证部分密码的可能性。

(另外:您应该在将用户名包含在查询中之前对其进行 LDAP 转义,以避免查询注入攻击。)

要进行部分密码登录,您需要一个包含可恢复内容的密码存储。通常的做法是将密码存储在具有对称加密的数据库中。这比明文要好,因为攻击者无法仅通过破坏数据库/服务器来获取密码,但如果他们能够破坏 Web 应用程序/服务器足以读取加密密钥,他们仍然可以获得密码。 (硬件解密可以在这里使用 HSM 提供帮助,但如果攻击者有足够的权限通过应用程序运行所有密码,则仍然没有用。)

添加应用级密码加密会增加复杂性,尤其是设置基础架构和流程以安全地管理加密密钥的生命周期。即使你做了所有这些,并考虑限制速率和审计以尝试检测和阻止密码数据库,它仍然比将密码存储为强哈希的行业标准(如 bcrypt 或 PBKDF2)要弱。

(旁白:虽然原则上您可以将部分密码存储为每个 n 字母组合的散列集合,但这使得单个散列中的熵量非常低,因此即使使用强散列也很容易破解- 强制一种组合,然后可以逐步打破相邻的组合。)

部分密码也有其他缺点:由于它们的熵低于完整密码,因此随机猜测成功的机会更高(通常,您会强制执行更严格的锁定限制和速率限制来进行补偿,但会付出一定的可用性和运营成本) ;他们对密码长度进行了限制,使用户更有可能选择弱密码,而不太可能选择容易记住的密码;并且它们使强制执行密码强度测量变得困难(例如:密码pass8R$kO 本身就相当强大,但在提示您输入前三个字母时就不那么强大了)。您还需要跟踪每个用户当前需要哪些字母,否则获得几个密码字母的攻击者可以简单地重新加载,直到提示他们输入他们知道的字符。 (令人惊讶的是,有多少部分密码登录错误,使整个练习变得毫无意义。)

总而言之,部分密码的缺点至少与优点一样多,而且不是一个简单的胜利,您可以随时部署以“提高”安全性。对于某些威胁模型,以及强大的审计和应用程序/基础设施安全控制机制,人们可能会争辩说它们有一些用处。但对于一般情况,它们通常被认为不值得。

但这并不会停止使用键盘记录器

没有什么可以阻止键盘记录器的使用,您不可能战胜控制用户交互的攻击者。任何使登录页面异常的东西(例如部分密码、虚拟键盘或其他)都只会停止最懒惰的通用键盘记录器。更复杂的木马仍然会通过各种方法捕获输入,甚至(通常在银行木马中)用普通密码框悄悄地替换您的部分密码输入控件!

部分密码通常被指定为比客户端木马更能抵御低级网络钓鱼攻击(虚假登录表单链接),尽管目前还不清楚它在这种情况下的效果如何。

访问客户和使用未知计算机并意外点击“记住密码”的风险

啊,那是另一回事。不需要的密码管理器可以解决,尽管浏览器开始在这里忽略 autocomplete,需要更多烦人的 JS 修复,叹息。

【讨论】:

    【解决方案2】:

    您的问题可以在这里得到解答:Password systems which ask for individual letters - what do they store?

    简而言之,部分密码验证会为您的数据库打开更多漏洞,因为您将不得不使用可解密的密码(非常糟糕)或存储有关密码的更多信息,这使得在以下情况下更容易暴力破解您的数据库已被破坏(坏的)。

    “k-out-of-n threshold secret sharing”看起来是最安全的方法。

    【讨论】:

      猜你喜欢
      • 2014-05-14
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      相关资源
      最近更新 更多