V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
tomato3
V2EX  ›  问与答

为什么很多网站登录失败只提示「登录失败」或「帐号或密码错误」,而没有更详细说明到底是账号还是密码错误?

  •  
  •   tomato3 · 2017-08-03 19:24:15 +08:00 · 9916 次点击
    这是一个创建于 2653 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有的人说,是后台在判断用户登录的时候,是使用用户名+密码一起一步验证,如果把用户名和密码分开判断,告诉登录者是密码错误,会有安全隐患。

    我觉得这只是一个托词而已,都在偷懒,正确的做法就是应该告诉用户到底是用户名错了,还是密码错了。

    首先,用户名和密码这两个东西,站在攻击者的角度,如果你告诉我“账号或密码错误”,那么我就去忘记密码那里,通过忘记密码知道用户名是否正确,那么你返回给我“账号或者密码错误”我就知道是密码错误。

    站在用户角度,如果忘记了用户名和密码,只是有点印象,那么网站提示“账号或者密码错误”,我根本不知道是账号错了还是密码错了,然后我还要去忘记密码那里去尝试几次账号,然后才能修改我的密码。如果一开始就提示我“账号不存在”,那么不可以不用跳转到忘记密码那里,多试几次,就能知道用户名输入正确,然后再尝试输入密码。

    “账号或密码错误”究竟是拦截恶意攻击者呢?还是给用户制造麻烦呢? Google 或者 Outlook 登录的都是输入邮箱,就会验证邮箱,然后再输入密码。为啥大家都不学习呢?

    第 1 条附言  ·  2017-08-04 17:10:16 +08:00

    我明白大多数的人都觉得只显示“账号或密码错误”更加安全,但是从人机交互的来看,提示“账号或密码错误”是会让人困惑的。难道以后所有的网站都要这么提示吗?有没有别的方法?总不能把思维局限在这一个地方吧?

    我说的通过注册能够知道账号是否存在,是很多网站都在使用的,也就是说,提示我“账号或密码错误”,加上注册的提示,我一样可以得到“用户名错误”的效果,但是就很麻烦。当然,也有的找回密码是不会透露用户注册信息的,隔离得非常好。

    之前是在别处看到的一篇文章,避免打广告嫌疑,就放出文章中链接的原出处,ux-writing-how-to-do-it-like-google-with-this-powerful-checklist

    文中将页面提示文案,从“失败!出现授权错误!” 改变成了“密码错误! 尝试?找回密码?”。 也就是说,文案提示本着为了更好的服务用户去考虑。

    假如我偏要提示“用户名不存在”和“密码错误”,那么要怎么考虑?

    ps:概率的公式可以不用看,图中概率的东西也有误= ,=,例如最后一个公式的图片中不应该是1-p1-p11,而是(1-p1)(1-p11),但是重点不是在概率上。 这是提示“用户名或密码错误”的状态图 用户名或密码错误.png 我们的目标是为了使得攻击者能够随机成功登录一个用户的概率最小,得到如下公式。 CodeCogsEqnSum2.gif 如果是提示“账号不存在”呢? 用户名不存在.png p11是一个账号不在另外一个网站使用的概率。 CodeCogsEqn3.gif为什么反而概率变小了?然后我发现第一个图漏掉了一个东西,就是用户名的明文空间U1,也就是直接暴露了用户名的的存在与否,在第一个公式中应该乘以1/U1(也可以说除以U1)。所以很明显,直接提示“用户名不存在”会大大增加账号被别人登录的概率。

    (解释上面那段话,就是从用户名的集合里取一个用户名出来,从密码的集合里取一个密码出来,攻击者要攻击总共有U1*M1种组合,如果提示“用户名不存在”,就只剩M1种组合了)

    那么有什么办法来弥补这U1倍的安全性差距呢?

    一个是限制密码组合和长度,采用更多的字符作为密码,这样可以增大M1的集合,有可能达到原来的安全水平,另外一种就是再多一个输入的空间,比如二级登录密码,或者自定义问题,完全可以抹平因提示“用户名不存在”而导致的损失。 然后我就想到了,人机验证。用户密码的授权都是为了确定是正确的用户在操作。那如果限定设备登录或者虹膜识别,图像识别,指纹识别等等的生物识别,那么是不是就已经可以跳过账号密码的文案了。然而现在大多数的都是采用随机验证码的方式,这种方式也相当于增加了一个明文空间,抹平了因提示“用户名不存在”而导致的损失”,但是现在机器学习能够破解这种验证码了,所以需要更优秀的人机验证方式。人机验证,不就可以提示“用户名不存在”了吗?难道真有人力输入暴力破解? 另外,机器暴力破解,到底是猜用户名的明文空间呢?还是使用别人脱裤的数据呢?后者的概率要大一些吧?如果密码被加密后,会增加攻击者状态图中的难度1。如果用户名和密码同时加密了,那么还原明文的用户名和密码,也是一个不小的难度。另外还有auth2.0,把裤子穿到别人身上。或者使用LastPass,把自己的密码隔离起来。

    说远了,回到正题,我们就是要让网站提示用户“账号不存在”,就是要更好的文案,怎么不降低安全性呢?说说你的看法。

    36 条回复    2017-08-04 23:33:47 +08:00
    crab
        1
    crab  
       2017-08-03 19:37:22 +08:00
    你这个例子在几个账号下是没区别。但在大数量,比如 1w 个账号,效率上还是有区别的。
    terence4444
        2
    terence4444  
       2017-08-03 19:40:13 +08:00 via iPhone
    Google 和 outlook 先输入邮箱是为了重定向到相应的登录界面,有很多公司买了 office365 就可以用公司邮箱登录 onedrive。
    FugueJoy
        3
    FugueJoy  
       2017-08-03 19:42:20 +08:00
    1. 有些产品在登录的时候是会提示『账号不存在』的
    2. 现在基本都是邮箱或手机号登录,普通用户都只有一个,忘记账号的几率本身就不大
    3. 这个体验的提升并不会对数据有提升,也就懒得优化了
    nflush
        4
    nflush  
       2017-08-03 19:45:08 +08:00 via Android
    登录用用户名,忘记密码申诉用邮箱和设置问题。
    感觉没什么不对
    binux
        5
    binux  
       2017-08-03 19:46:12 +08:00 via Android   ❤️ 1
    我实现的忘记密码不会告诉你用户名是否存在
    nflush
        6
    nflush  
       2017-08-03 19:46:35 +08:00 via Android   ❤️ 1
    @nflush 简单的说,可以在忘记密码部分尝试用户名是否存在本身就是有问题的。
    xfspace
        7
    xfspace  
       2017-08-03 20:31:08 +08:00 via Android
    以前的网站提示很明了。
    现在为了安全都不说是用户名还是密码错了
    whatsmyip
        8
    whatsmyip  
       2017-08-03 20:39:55 +08:00
    安全问题。

    不过我认为提示用户名是否存在是完全没问题的,因为注册这一步已经可以用于查询用户名是否存在。

    不知道是否还有其他原因
    millionart
        9
    millionart  
       2017-08-03 20:42:48 +08:00   ❤️ 1
    这是一种安全策略,为暴力破解增加难度
    单纯站在用户的角度考虑不如直接显示正确的账号密码吧?

    这是安全和易用性的选择,而且在这个步骤,易用性越差安全性越强
    geelaw
        10
    geelaw  
       2017-08-03 20:51:35 +08:00
    Google/Outlook 那个叫 federated sign-in ……

    实际上提醒应该是“用户名不存在”或“用户名或密码错误”。
    zado
        11
    zado  
       2017-08-03 20:57:59 +08:00   ❤️ 1
    如果账号不存在,可以提示;但如果是账号存在,网站就不可能 100%准确判断出你是账号错误还是密码错误,假如给了错误的提示,会给用户造成误导。
    Yourshell
        12
    Yourshell  
       2017-08-03 21:15:16 +08:00
    你想多了,普通用户都是 sb。
    rogwan
        13
    rogwan  
       2017-08-03 21:37:57 +08:00 via Android
    如果提示账号不存在,会给部分人通过这个方式去探测这个 ID 是否可注册。通常这个都是在注册的是才会提供的检测(当然也有网站注册的时候都不提供检测,提交之后表单全清空,告诉你用户名已经存在,这样太搓了)
    jarlyyn
        14
    jarlyyn  
       2017-08-03 21:38:59 +08:00
    这个是我被要求改掉的某个不安全功能之一。

    可以试探帐号
    lzhr
        15
    lzhr  
       2017-08-03 21:39:30 +08:00
    用户名存在吗
    用户名存在,是你的帐号吗
    是你的帐号 1 还是账号 2
    KeepPro
        16
    KeepPro  
       2017-08-03 23:16:00 +08:00 via Android   ❤️ 1
    系统怎么知道是用户名还是密码不对?系统只知道账户密码不匹配。
    fayloue
        17
    fayloue  
       2017-08-03 23:26:41 +08:00
    如果用户 A 的账号是 12345,用户 B 的账号是 123456,用户 A 时间很长时间没有登录过记不清账号是多少,然后系统提示密码错误,但事实上是用户名错误。 系统跟本不知道这是谁在登录。
    gefranks
        18
    gefranks  
       2017-08-03 23:30:04 +08:00
    安全问题 可以用来收割账号后对存在的账号进行攻击
    boboliu
        19
    boboliu  
       2017-08-03 23:40:06 +08:00   ❤️ 1
    关于“那么我就去忘记密码那里,通过忘记密码知道用户名是否正确”,通常一个安全的忘记密码的返回应该是“如果账号存在,那么我们已经发送邮件到你的邮箱”
    imn1
        20
    imn1  
       2017-08-04 00:09:16 +08:00
    一个账户 aaa,另一个账户 aaa1,然后其中一个输入密码不匹配,能判断是“帐号错误”么?
    yksoft1
        21
    yksoft1  
       2017-08-04 01:09:08 +08:00
    因为可以猜解出账号本身存不存在,因此不能把账号不存在和密码错误的提示分开来。而且,在提示信息返回时间上也要尽量不要有区别,减少利用时间差来判断的可能
    bear2017
        22
    bear2017  
       2017-08-04 01:24:58 +08:00 via Android
    一般是:账号不存在,然后再是用户名或密码错误。一般都指的是密码错误。而且 [账号或密码错误] 仅仅是前台的一个提示而已,程序也可以定义其他的提示信息 [例如:账号密码不匹配...等等] ,不存在偷懒一说。
    incompatible
        23
    incompatible  
       2017-08-04 03:51:30 +08:00 via iPhone
    @binux 你实现的注册功能是不是也不会告诉楼主用户名是否存在?😂
    binux
        24
    binux  
       2017-08-04 03:56:18 +08:00 via Android
    @incompatible 如果真的不存在可是会真的注册成功的。你确定有人会去试?
    killadm
        25
    killadm  
       2017-08-04 04:03:48 +08:00 via Android
    而且谷歌在当你输入原密码的时候会提醒你多长时间之前修改过密码
    incompatible
        26
    incompatible  
       2017-08-04 04:10:53 +08:00 via iPhone
    @binux 高明一些的注册流程是输完用户名后用户就会知道该用户名是否已存在的,否则被占用还要等提交后才知道的话用户会很恼火的。

    假设你的登录流程没这么高明,就算恶意用户懒得去试,这里依然是有漏洞的。并不是把找回密码做得没有漏洞就高枕无忧了。
    binux
        27
    binux  
       2017-08-04 04:15:35 +08:00 via Android
    @incompatible 用户名是邮箱,被占用也是用户自己的。
    paulagent
        28
    paulagent  
       2017-08-04 06:27:26 +08:00 via Android
    这个东西就和很多系统里有 bug 存在 n 年以上都不改一样,请问改了有什么好处?没好处为什么要改,改出问题谁来背锅?我干活这几年见过好几起事故.一个典型的就是有个哥们自告奋勇要修个 bug,没想到修完之后系统挂了。

    你肯定说就前台一个提示,两行代码搞定,不会出错,那个哥们当年也和你一个月想法
    cchilar
        29
    cchilar  
       2017-08-04 08:24:11 +08:00 via Android
    很多网站的后台是用户名和密码都是加密保存的,登陆时候就是一起检验。
    B4a1n
        30
    B4a1n  
       2017-08-04 10:13:24 +08:00
    提示账号或者密码错误本身就安全问题
    在进行暴力破解的时候我可以批量测试获得系统中存在的用户列表 再进行特定的密码破解

    针对这种情况很多公司都采用的 正确的用户名+密码加密成一个字符串然后存储在数据库中
    ylsc633
        31
    ylsc633  
       2017-08-04 10:40:04 +08:00
    不管账号是否存在 或者账号 或者密码错误 都提示 账号密码错误!

    我有时候 确实忘记了 这个平台的注册号.. 那么 我会尝试去注册.. 如果提示 该邮箱已被注册!

    那么说明这个平台我是用这个邮箱注册的....
    tomato3
        32
    tomato3  
    OP
       2017-08-04 17:13:50 +08:00
    @zado 然而“账号或密码错误”不就已经很让人困惑了吗?
    tomato3
        33
    tomato3  
    OP
       2017-08-04 17:15:53 +08:00
    @FugueJoy 之前有使用手机号登陆的经历,然后提示我“账号或密码错误”,尝试了几次后我换成另外一个手机号,终于成功了。
    tomato3
        34
    tomato3  
    OP
       2017-08-04 17:19:35 +08:00
    @millionart 暴力破解无论怎么样都有,只要剔除掉机器,那么就能保证是用户在操作了啊,就能给用户更好的反馈了啊。类似淘宝和微信,登录成功后,会使用最近购买的东西或好友头像来识别,这种同时在易用性和安全性上都很强啊。
    tomato3
        35
    tomato3  
    OP
       2017-08-04 17:22:34 +08:00
    @ylsc633 2333 我也是这样
    millionart
        36
    millionart  
       2017-08-04 23:33:47 +08:00 via iPhone
    你可以不计成本去提高安全性和用户体验,但是不能指望别的网站都跟上
    如果有现有的方案可以借鉴,就去实现试试
    还是说你希望实现更高级(当今不存在)的方案
    我不想参与这个话题了,请不要 @ 我
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2935 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:39 · PVG 22:39 · LAX 06:39 · JFK 09:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.