我明白大多数的人都觉得只显示“账号或密码错误”更加安全,但是从人机交互的来看,提示“账号或密码错误”是会让人困惑的。难道以后所有的网站都要这么提示吗?有没有别的方法?总不能把思维局限在这一个地方吧?
我说的通过注册能够知道账号是否存在,是很多网站都在使用的,也就是说,提示我“账号或密码错误”,加上注册的提示,我一样可以得到“用户名错误”的效果,但是就很麻烦。当然,也有的找回密码是不会透露用户注册信息的,隔离得非常好。
之前是在别处看到的一篇文章,避免打广告嫌疑,就放出文章中链接的原出处,ux-writing-how-to-do-it-like-google-with-this-powerful-checklist。
文中将页面提示文案,从“失败!出现授权错误!” 改变成了“密码错误! 尝试?找回密码?”。
也就是说,文案提示本着为了更好的服务用户去考虑。
假如我偏要提示“用户名不存在”和“密码错误”,那么要怎么考虑?
ps:概率的公式可以不用看,图中概率的东西也有误= ,=,例如最后一个公式的图片中不应该是1-p1-p11,而是(1-p1)(1-p11),但是重点不是在概率上。
这是提示“用户名或密码错误”的状态图
我们的目标是为了使得攻击者能够随机成功登录一个用户的概率最小,得到如下公式。
如果是提示“账号不存在”呢?
p11是一个账号不在另外一个网站使用的概率。
;
为什么反而概率变小了?然后我发现第一个图漏掉了一个东西,就是用户名的明文空间U1,也就是直接暴露了用户名的的存在与否,在第一个公式中应该乘以1/U1(也可以说除以U1)。所以很明显,直接提示“用户名不存在”会大大增加账号被别人登录的概率。
(解释上面那段话,就是从用户名的集合里取一个用户名出来,从密码的集合里取一个密码出来,攻击者要攻击总共有U1*M1种组合,如果提示“用户名不存在”,就只剩M1种组合了)
那么有什么办法来弥补这U1倍的安全性差距呢?
一个是限制密码组合和长度,采用更多的字符作为密码,这样可以增大M1的集合,有可能达到原来的安全水平,另外一种就是再多一个输入的空间,比如二级登录密码,或者自定义问题,完全可以抹平因提示“用户名不存在”而导致的损失。
然后我就想到了,人机验证。用户密码的授权都是为了确定是正确的用户在操作。那如果限定设备登录或者虹膜识别,图像识别,指纹识别等等的生物识别,那么是不是就已经可以跳过账号密码的文案了。然而现在大多数的都是采用随机验证码的方式,这种方式也相当于增加了一个明文空间,抹平了因提示“用户名不存在”而导致的损失”,但是现在机器学习能够破解这种验证码了,所以需要更优秀的人机验证方式。人机验证,不就可以提示“用户名不存在”了吗?难道真有人力输入暴力破解? 另外,机器暴力破解,到底是猜用户名的明文空间呢?还是使用别人脱裤的数据呢?后者的概率要大一些吧?如果密码被加密后,会增加攻击者状态图中的难度1。如果用户名和密码同时加密了,那么还原明文的用户名和密码,也是一个不小的难度。另外还有auth2.0,把裤子穿到别人身上。或者使用LastPass,把自己的密码隔离起来。
说远了,回到正题,我们就是要让网站提示用户“账号不存在”,就是要更好的文案,怎么不降低安全性呢?说说你的看法。