偶尔(尽管很少),我们的一些用户说他们的密码不起作用:他们说他们输入了正确的密码,但收到了“密码错误”消息。

我们告诉他们使用他们确实有重设密码功能,但是他们仍然带着这种感觉,即身份验证系统有时无法正常工作。不能将其存储为纯文本格式,有什么办法可以证明是这种情况吗?

在某些情况下,我们可以向他们显示他们在某个日期更改了密码然后忘记了密码,他们对此感到满意。但这并非总是如此。

评论

评论不作进一步讨论;此对话已移至聊天。

#1 楼

没有一个真正快速的方法来证明这一点,因为散列被设计成不可逆的。您应该使用加盐的哈希值(即BCrypt),因此请确保使用相同的盐值。 。
生成的哈希值很可能会有所不同,因此您已经排除了登录代码的问题,但是密码设置仍然可能有问题,或者手动生成时出错。

那几乎就是您可以检查一个人的密码的程度。除此之外,我们还进行系统测试。但是,这种方法可能会显得过大。
最好的办法是检查您的登录代码以及所有重置密码的点。该代码应尽可能简短。以我的经验,排除极端情况问题的最佳方法是使用代码审查,因为这种极端情况通常不包含在手动测试中。

确保任何密码maxlength<input>设置都一致(或更好,但不存在)。您正在寻找密码设置和登录表单之间的一致性。
请确保没有服务器端截断。
请确保编码一致。如果密码中使用了非ASCII字符,则密码设置表单和登录表单的行为必须完全相同。
也不要自动从密码中剥离空格或非ASCII字符之类的内容。如果您的代码简洁明了,您可以通过代码审查轻松地找到这种东西。首先输入正确的用户名。
检查大写锁定设置是否正确。

为客户支持人员提供每个登录日期/时间或密码重设的日志。如果自上次重置以来至少有一个登录名,那么他们就知道系统正常工作。有理由确定该问题一定是密码输入错误。这样可以减少对客户服务的呼叫。
重置密码以提醒客户时,通过电子邮件通知客户可能会有所帮助。 (或其他家庭成员,如果使用共享帐户)


评论


除了编码步骤,我还将检查执行的所有数据验证或字符过滤是否也一致。 LinkedIn曾经允许我输入|输入密码,然后完美登录他们的网站。但是他们的移动应用程序显然不接受带有该字符的密码,并拒绝对我进行身份验证,直到我将其删除为止。

– PwdRsch
16年9月9日在17:28

其他人工提示:验证他们使用与创建密码时相同的输入语言和键盘布局。如果他们的PC上安装了多种语言,则可能是他们不小心按下了切换到下一种语言的组合键,因此,他们所按的键不会产生期望的字符。

–shoover
16年9月9日在18:16



我同意不应在密码中去除空格,但可以考虑至少修剪空白。开头或结尾的偶然空间很常见。我知道有些人本能地在每个输入的末尾添加一个空格(我想是因为他们习惯于在单词后添加一个空格)。

– MichaelRushton
16-11-10在11:50



无论您做什么:都不要训练用户向任何人提供密码

– Dennis Jaheruddin
16年11月10日在12:18

对我来说,领导空间也一直是用户中的大问题。人们习惯于按下空格键以使计算机从睡眠中恢复过来,因此他们本能地在登录屏幕上进行操作...

–布赖恩·诺伯劳赫(Brian Knoblauch)
16年11月10日在14:23

#2 楼

有一种方法可以确定,那就是计算用户输入的哈希值,使用相同的盐,然后将其与您拥有的盐进行比较。但是,这就是登录过程已经执行的操作,用户不相信这一点。为他们服务时,为什么他们会相信它?

为用户提供一种验证他们输入的内容的方法。不能从用户的肩膀上看到密码。因此,提供一个将这些点转换为实际字符的按钮。
这样,在输入错误的密码后,他们可以再次输入该密码并查看刚刚输入的内容。或者,他们可以在登录之前进行检查。用户都可以通过这种方式检测到它们。

评论


是的,一个好主意。由于大多数站点尚未实现此功能,而大多数站点仍未实现,因此我使用FIrefox加载项:“显示我的密码”。

–凯文·费根(Kevin Fegan)
16-11-14在14:53



#3 楼

要改善用户体验,您首先需要添加一些UI来告知用户以下情况:


大写锁定已激活
警告用户名中是否包含尾随空格
警告密码中是否包含空格
防止在电子邮件中使用空格(如果使用电子邮件代替用户名)
防止使用并自动删除换行符(有几种新的换行符)
防止使用并自动删除控制字符
如果您使用的是Javascript,则某些浏览器已将其禁用,因此您必须在服务器端移动这些步骤。

当密码输入错误时,也会显示以下内容消息:


密码或用户名/邮件错误,请输入时注意小写或大写字母以及所有符号数字,它们必须完全匹配。避免进行复制粘贴,因为有时复制文本可能会添加其他多余的空格和/或换行符。


请记住,您的用户可能是正确的!我曾经有一部旧手机,不允许我登录到网页,我不知道这是否是文本编码问题,但是我的密码是字母数字,并且可以在PC上正常使用。

评论


此消息暗含不鼓励使用密码管理器。我在管理器上使用的最多是autofill选项,但是在那之后通常会出现复制粘贴选项,当由于Flash /域名/输入字段代码/一般不兼容而导致自动填充功能无法使用时。

– Nzall
16 Nov 10'23:06

它还包含一个逗号接头。

–JDługosz
16年11月11日在9:56

@Nzall他并不是要从技术上阻止人们粘贴。使用密码管理器的人知道他们在做什么-从文本文件,电子邮件,Word文档中复制和粘贴的人可能会引入不需要的空格。

–Random832
16年11月12日在11:37

#4 楼

公认的答案实际上涵盖了大部分内容。但是,假设我尝试了所有建议,但仍然找不到问题,那么我将尝试在发生错误时捕获错误。为此,如果用户连续两次登录失败,您可以添加记录接收到的纯文本密码的代码(以便过滤掉所有犯了一个愚蠢错误并在第二次尝试中进行更正的用户)。

为了不削弱系统的安全性,只有在电话上确实有一个用户登录失败时,才可以启用密码记录功能,并且仅使用以下方式记录他/她的密码:获得他/她的同意。

记录您的应用程序看到的实际密码的好处是,您可以准确地看到应用程序看到的内容。在绝望的用户打了几次电话之后,您可能会开始在他们的密码中选择一种模式(例如,尾随空格,特殊字符等),该模式指出您的登录代码有问题,或者您可能会看到他们打算输入“ mysweetheart”而是键入“ myseetheart”,这意味着登录问题很可能是所有用户错误。

评论


这听起来有些粗略。一旦我知道管理员可以看到我的纯文本密码,我将永远不会信任系统。

–Pranab
16年11月11日在10:24

我在原则上表示同意,但可悲的事实是,为登录网页提供服务的所有服务器的管理员很可能会看到您的密码。那么,您如何知道每天使用的服务不这样做呢?唯一使您的密码保密的是他们的道德和公司规定。

–带外
16年11月11日在16:55



#5 楼

我不认为手动执行密码哈希步骤将是解决方案。当然,如果您检测到它确实失败了,可以在底层进行调试,但是您的客户几乎会立即忘记它。

这里的问题是他们使用的是错误的密码,可能是因为他们输错了密码,或者是真的认为自己使用的密码与他们输入的密码不同。 (记事本),将其剪切到剪贴板上并粘贴到密码字段中。密码会在此过程中显示给客户,这样就可以避免按下错误的字母,设置了Caps Lock的情况……(当然,我们希望他们在其他人都没有看到他们的屏幕的时候这样做)

第二种情况比较困难,因为我们不想鼓励客户保留带有密码的文本文件。理想情况下,您可以说服客户使用KeePass之类的密码管理器。然后,如果从密码管理器中正确复制了以前使用过的密码,则可以确定它确实是正确的密码。

除此之外,确实需要更改考虑到您的客户,您可以要求客户:


创建新密码
通过粘贴将其更改为密码
尝试使用剪贴板中要使用的密码相同,

需要多次,以便尝试重现。

#6 楼

假设您每次用户登录时都在登录,则可以表明他们自从上次更改密码以来就能够登录。这至少足以排除一些潜在的问题。

#7 楼

在遇到具有此实际属性的四个不同的身份验证系统时,在每种情况下都很容易验证。

情况1:系统随机失败。失败时,错误的登录计数器不会增加。 (我无法检查内部情况,但是我很确定所发生的情况是它有时与另一台服务器失去连接,并且在发生这种情况时仅报告了错误的密码。)

情况2:系统当我在密码中输入撇号时,该图标爆炸了。证明密码字段受到SQL注入的影响微不足道。这也很容易说明问题。

案例4:系统不允许我登录,因为它将符号标识为终止行。 Booo。通过Telnet登录到FTP端口证明我具有正确的密码。

#8 楼

您可以在数据库中存储每个用户的最后几个(哈希)密码。如果输入的密码与当前密码不匹配,请将其与旧密码进行比较。如果存在匹配项,请显示“您已输入旧密码-请重试”消息或与此相关的错误代码(因此,当他们与您联系时,您可以询问“您是否看到错误代码47?这意味着您已经使用了旧密码。“)

这样,您可以确定登录系统正在运行,因为它至少进行了一些密码查找,并且用户得到一些反馈,告知他们忘记了新密码。

评论


但是,这也会引入用户枚举缺陷-如果转储了密码数据库,并且用户在此之后更改了密码,则具有转储的攻击者仍可以确认该用户存在。如果他们只是遇到标准错误,则一旦更改密码就不会知道。可能性很小,但仍然如此。

–马修
16年10月10日在15:48

这确实牺牲了一些安全性。这里有一个更详细的讨论:Facebook存储旧密码是否会危及安全性?

–布莱恩·菲尔德(Bryan Field)
16年11月11日在1:32



#9 楼

我要发布第二个答案,我昨天曾想过,但不确定是否建议这样做。安全专家(包括我在内)会对这种加密(而不是散列)密码(甚至不正确的密码尝试)的想法感到震惊,因此,如果您决定需要开始记录此信息,我建议采取三种预防措施。


将信息提交到单独的/隔离的计算机中,这样,如果主服务器受到威胁,则密码日志仍然是安全的。
对记录的信息使用公共密钥(非对称)加密。私有(解密)密钥仅存储在隔离的环境中,以供开发人员查看记录的数据。
安排任务(或对其进行编码),以便在特定日期或以下情况禁用此临时日志:足够数量的测试已成功。


评论


我不确定牺牲每个人的安全来证明某些愚蠢的人是错误的,这不是一个好主意。即使采取了所有预防措施,这也是巨大的风险。同样从这个问题来看,客户服务似乎需要访问此信息,因此他们可能不像开发人员那样受信任。最后,可以(并且应该)使用演示数据库上的单元测试来测试密码系统。

–AndréBorie
16年11月10日在20:43

遵循预防措施1和2,只要仔细遵循“隔离”一词,这可能是可以接受的风险。 (即没有直接互联网访问权限的计算机,只有少数几个网络服务可供单个开发人员使用),尽管如此,这可能是一种诱惑。显然,将这​​些内容提供给客户服务将是巨大的风险! (即不会很好隔离)

–布莱恩·菲尔德(Bryan Field)
16-11-10在21:07



如果您要执行类似的操作,请在文件中放置一个字段,指出是否应使用此类日志记录,并仅在抱怨的人身上打开它。

–Loren Pechtel
16年11月14日在7:04