我希望能够询问用户名,检索用户密码,然后从密码中随机选择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
有没有人有任何例子
答案 0 :(得分:0)
您的问题可以在这里得到解答:Password systems which ask for individual letters - what do they store?
缺点是部分密码验证会使您的数据库打开更多漏洞,因为您将不得不使用可解密的密码(非常糟糕)或存储有关密码的更多信息,这样可以更容易暴力破解你的数据库受到了损害(糟糕)。
" k-out-of-n阈值秘密共享"看起来是最安全的方法。
答案 1 :(得分:0)
您似乎正在针对Active Directory后端进行身份验证。 AD不提供验证部分密码的任何可能性。
(旁白:在将用户名包含在查询中之前,您应该使用LDAP来转义用户名,以避免查询注入攻击。)
要进行部分密码登录,您需要具有可恢复内容的密码存储。通常的做法是将密码存储在具有对称加密的数据库中。这比明文更好,因为攻击者无法通过破坏数据库/服务器来获取密码,但是如果他们可以危害Web应用程序/服务器足以读取加密密钥,他们仍然可以获取密码。 (硬件解密可以帮助使用HSM,但如果攻击者有足够的权限通过应用程序运行所有密码,则仍无用。)
添加应用程序级密码加密会增加复杂性,尤其是设置基础架构和流程以安全地管理加密密钥的生命周期。即使你做了所有这些,并考虑限速和审计来尝试检测和阻止密码数据库,它仍然比将密码存储为强哈希(如bcrypt或PBKDF2)的行业标准更弱。
(旁白:虽然原则上你可以将部分密码存储为每个n字母组合的哈希集合,这使得单个哈希中的熵数量非常低,这样即使使用强哈希也很容易粗暴 - 强制使用一个组合,然后可以逐渐破坏相邻组合。)
部分密码还有其他缺点:因为它们的熵低于完整密码,因此成功随机猜测的可能性更高(通常会强制执行更严格的锁定限制和速率限制,以补偿某些可用性和运营成本) ;他们对密码长度施加限制,使用户更有可能选择弱密码而不太可能选择令人难忘的密码;并且它们使得难以强制执行密码强度测量(例如:密码pass8R$kO
本身相当强,但在提示您输入前三个字母时则不是那么多。您还需要跟踪每个用户当前想要的字母,否则获得密码的几个字母的攻击者可以直接重新加载,直到提示他们知道的字符为止。 (令人惊讶的是,有多少部分密码登录错误,使整个练习毫无意义。)
总而言之,部分密码至少具有与优势一样多的缺点,并且不是一个简单的胜利,您可以随时部署以“改善”安全性。对于某些威胁模型,以及强大的审计和app / infra安全控制机制,可以说它们有一些用处。但对于一般情况,他们通常被认为是不值得的。
这不会停止使用键盘记录器
没有什么能阻止使用键盘记录器,你不可能赢得控制用户交互的攻击者。任何使登录页面异常(例如部分密码,虚拟键盘或其他)的东西都将只停止最懒的通用键盘记录器。更复杂的木马程序仍将通过各种方法捕获输入,甚至(通常在银行木马中)默默地用普通密码框替换部分密码输入控件!
部分密码通常被指定为低级别网络钓鱼攻击(虚假登录表单链接)的计数器,而不是客户端木马,但目前还不清楚这种情况的效果如何。
啊,这是另一回事。尽管浏览器在这里开始忽略人们访问客户并使用未知计算机并意外点击“记住密码”的风险
autocomplete
,但是需要更多令人讨厌的JS修复程序,所以可以解决不需要的密码管理器问题。