V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
est
V2EX  ›  信息安全

直接用 TOTP 代替密码登录 有啥问题么?

  •  1
     
  •   est · 2024-07-05 14:30:01 +08:00 · 3416 次点击
    这是一个创建于 434 天前的主题,其中的信息可能已经有所发展或是发生改变。

    密码难得记,被破了又很麻烦。

    既然都有各种 2FA 绑定,要不直接用 账号+TOTP 登录。不要密码了。

    TOTP 每分钟刷新一次,限制每 10 秒只能尝试一次登录。这样有啥安全问题么?

    29 条回复    2024-07-09 16:12:01 +08:00
    monkeyk
        1
    monkeyk  
       2024-07-05 14:39:14 +08:00
    实际上是可以的,这里面需要有几个问题要注意:
    1. 用户从哪查看 TOTP ,手机 APP, 小程序,还是??
    2. 如果用户的 TOTP 丢失了如何办,如何重置或重新绑定;

    这东西技术上可以,但要和用户使用习惯绑定起来;和短信比起来,totp 无成本,但需要手机设备上有相应的支持。
    dya
        2
    dya  
       2024-07-05 14:39:17 +08:00
    国内这样做没有安全问题。中国的银行其实就是这样做的。只不过是用手机验证码代替,而且这个验证码不是 1 分钟失效的。我估计至少 5 分钟内都可以用吧。登陆要手机验证码,转账也要手机验证码,还需要扫脸证明目前的你跟银行保存的你一致才行。但国外不行。国外没有办法证明目前这个使用者是第一次注册的那个人。
    liuidetmks
        3
    liuidetmks  
       2024-07-05 14:42:50 +08:00   ❤️ 1
    没什么问题,微软先前推广一次性密码,现在推广无密码。鼓励用户删掉账号密码,采用 fido2
    815979670
        4
    815979670  
       2024-07-05 14:46:33 +08:00   ❤️ 1
    如果这样的话 不如直接用 WebAuthB ,这样安全性更高,https://webauthn.io ,国内可以去 阮一峰博客登录体验一下
    keyfunc
        5
    keyfunc  
       2024-07-05 14:49:11 +08:00
    可能会有这样的问题,如果 TOTP 的强度不够高。如果有人获取了用户列表,是不是可以暴力破解?
    est
        6
    est  
    OP
       2024-07-05 15:41:17 +08:00
    @keyfunc 我一开始也有这个担心。但是没想出来,TOTP 怎么暴力破解? 这玩意一分钟变一次。
    keyfunc
        7
    keyfunc  
       2024-07-05 15:44:37 +08:00
    @est 假设哈,TOTP 6 位纯数字,拿到用户列表后,每十秒用 000000 这个口令对这些用户全尝试登录一次,理论上只要用户基数够大,IP 数量够多,你没办法判断是不是正常登录吧。
    drymonfidelia
        8
    drymonfidelia  
       2024-07-05 15:50:20 +08:00
    @keyfunc 几年前我记得国内微博一个手机号一天最多获取 3 次验证码,超过会提示 24 小时后再试,按这样设计 TOTP 也可以只允许一个用户 4 小时内验证 3 次
    keyfunc
        9
    keyfunc  
       2024-07-05 15:53:39 +08:00
    Quarter
        10
    Quarter  
       2024-07-05 16:14:50 +08:00   ❤️ 1
    有一些开源软件确实是这么做的,比如之前的长亭 WAF 就是直接输入 OTP 就行,但是后面更新加入了先输入用户名密码再输入 OTP 的逻辑
    est
        11
    est  
    OP
       2024-07-05 16:16:32 +08:00
    @keyfunc

    第一,是 @drymonfidelia 说的单个账户禁止连续多次验证

    第二,雷同的 TOTP 只能第一个通过,剩余就 1 分钟跳成别的了再来吧。
    cat9life
        12
    cat9life  
       2024-07-05 16:17:12 +08:00
    @est #6 是可以爆破的,实际使用上可不是理论。我见过爆破谷歌验证器的。
    cinlen
        13
    cinlen  
       2024-07-05 16:32:52 +08:00
    @est totp 本质是用户的 secret + 时间算出来的, 算法是确定的,只要拿到用户 secret 任何时候都能算出正确的 totp 。

    所以哪怕它一分钟变一次,也没有增加破解难度。
    leonshaw
        14
    leonshaw  
       2024-07-05 16:40:10 +08:00
    服务端要存 TOTP secret ,拖库直接 G
    leonshaw
        15
    leonshaw  
       2024-07-05 16:43:52 +08:00
    另外虽然可以限制 IP 、账号的登录尝试间隔,但是我可以用多个 IP 同时尝试多个账号,根据生日悖论很容易产生碰撞
    cinlen
        16
    cinlen  
       2024-07-05 16:50:22 +08:00
    密码是用户提供给网站的,泄露了可以修改。 totp secret 是网站提供给用户的,泄露了咋整。
    retanoj
        17
    retanoj  
       2024-07-05 17:04:30 +08:00
    @cinlen #16
    totp 的“根”还是秘钥。既然是秘钥,那在业务逻辑上是可以做到用户提供给网站的。

    我觉得 TOTP 做密码的问题在于把密码这个无限的空间压缩到了有限的 6 位数字空间,同时增加了时间限制。
    但也面临着有限时间内猜解数字口令,以及在遍历用户碰撞口令的问题。
    est
        18
    est  
    OP
       2024-07-05 21:36:53 +08:00
    @leonshaw 拿同一个 TOTP ,用多个 IP 尝试多个账号? 这个前面说了,相同 TOTP 只允许成功一次就行了。

    另外,这个和拿同一个密码去尝试多个账号有啥区别?

    拖库这个,有没有 TOTP 加盐的办法?

    @cinlen 再重新生成一套?
    likelylee
        19
    likelylee  
       2024-07-06 10:06:32 +08:00
    首先 TOTP 有个最大的问题是时间同步,你看一下他的算法就知道了,简单理解就是时间加上用户的唯一序列号做 hash 生成,所以客户端和服务器端要保持时间一致,这也是为什么大部分 TOTP 都是分钟为单位。如果真的做到 10 秒钟,用户这边看到、输入、确认,那边已经超时了比对不一致了。我们早年做过滑动时间窗口做客户端和服务器的时间偏移,但是没有特别的意义。
    然后针对脱库这个,库里可以保存用户唯一序列号的强加密数据,这样即使拿到也是加密后的数据。但是加解密也是有时间损耗的,当然不会到秒级,但是用户量大的时候,专门为了登录这个动作而损耗计算时间是否有意义?
    最后,现在的合规要求都是多因素,密码+TOTP 是最理想的双因素认证形式。可以考虑在使用 TOTP 的前提下略微降低对密码复杂度的要求,这也是目前部分认证的思路。
    再最后,密码这块不要考虑这些有的没的,有任何想法请上 FIDO2 。
    leonshaw
        20
    leonshaw  
       2024-07-06 11:45:56 +08:00 via Android
    @est 区别就是密码空间比 TOTP 空间大得多。虽然 secret 足够复杂,但是验证码只有 6 位数字,不需要知道序列,只要碰出一次就够了。
    leonshaw
        21
    leonshaw  
       2024-07-06 11:57:10 +08:00 via Android
    服务端要算出同样的验证码来比较,没办法加盐。除非用某种同态变换,肯定不是现在的算法。
    neroxps
        22
    neroxps  
       2024-07-06 17:44:11 +08:00 via iPhone
    passkey 现在不是很舒服么
    artiga033
        23
    artiga033  
       2024-07-06 23:37:52 +08:00 via Android   ❤️ 1
    @liuidetmks 微软这个最搞笑,如果你删掉了账号密码,那就无法远程桌面到 Microsoft 账号的 Windows ,因为 rdp 协议目前还只支持经典账号密码
    hicdn
        24
    hicdn  
       2024-07-06 23:39:53 +08:00
    现在的 passkey 就是在解决这个问题
    azraeljack
        25
    azraeljack  
       2024-07-07 09:04:29 +08:00
    密码至少还能记住,totp 还得每次掏 authenticator 出来查,这种场景用 passkey 不是更好么。
    hanyuwei70
        26
    hanyuwei70  
       2024-07-07 15:06:55 +08:00
    如果是全新系统一律推荐直接上 FIDO2
    MagicalCarl
        27
    MagicalCarl  
       2024-07-07 21:45:54 +08:00
    我觉得安全性是可以的,我记得之前的支付宝未登录支付的话只需要输入账户名和 6 位数支付密码即可,支付密码只能尝试五次
    dorothyREN
        28
    dorothyREN  
       2024-07-07 23:34:36 +08:00
    totp 30 秒内 10w 次一定可以登录成功
    BadFox
        29
    BadFox  
       2024-07-09 16:12:01 +08:00
    @keyfunc
    OTP 喷洒...思路是 OK 的,但是异常动作检测就行,一个 IP 对不同用户喷洒多次就直接封禁,这样你有几个 IP 可以切?
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   924 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:43 · PVG 04:43 · LAX 13:43 · JFK 16:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.