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

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

  •  1
     
  •   est · 147 天前 · 2942 次点击
    这是一个创建于 147 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

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

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