密码难得记,被破了又很麻烦。
既然都有各种 2FA 绑定,要不直接用 账号+TOTP 登录。不要密码了。
TOTP 每分钟刷新一次,限制每 10 秒只能尝试一次登录。这样有啥安全问题么?
![]() |
1
monkeyk 64 天前
实际上是可以的,这里面需要有几个问题要注意:
1. 用户从哪查看 TOTP ,手机 APP, 小程序,还是?? 2. 如果用户的 TOTP 丢失了如何办,如何重置或重新绑定; 这东西技术上可以,但要和用户使用习惯绑定起来;和短信比起来,totp 无成本,但需要手机设备上有相应的支持。 |
2
dya 64 天前
国内这样做没有安全问题。中国的银行其实就是这样做的。只不过是用手机验证码代替,而且这个验证码不是 1 分钟失效的。我估计至少 5 分钟内都可以用吧。登陆要手机验证码,转账也要手机验证码,还需要扫脸证明目前的你跟银行保存的你一致才行。但国外不行。国外没有办法证明目前这个使用者是第一次注册的那个人。
|
![]() |
3
liuidetmks 64 天前 ![]() 没什么问题,微软先前推广一次性密码,现在推广无密码。鼓励用户删掉账号密码,采用 fido2
|
![]() |
4
815979670 64 天前 ![]() 如果这样的话 不如直接用 WebAuthB ,这样安全性更高,https://webauthn.io ,国内可以去 阮一峰博客登录体验一下
|
![]() |
5
keyfunc 64 天前
可能会有这样的问题,如果 TOTP 的强度不够高。如果有人获取了用户列表,是不是可以暴力破解?
|
![]() |
7
keyfunc 64 天前
@est 假设哈,TOTP 6 位纯数字,拿到用户列表后,每十秒用 000000 这个口令对这些用户全尝试登录一次,理论上只要用户基数够大,IP 数量够多,你没办法判断是不是正常登录吧。
|
8
drymonfidelia 64 天前
@keyfunc 几年前我记得国内微博一个手机号一天最多获取 3 次验证码,超过会提示 24 小时后再试,按这样设计 TOTP 也可以只允许一个用户 4 小时内验证 3 次
|
![]() |
9
keyfunc 64 天前
@drymonfidelia 确实
|
10
Quarter 64 天前 ![]() 有一些开源软件确实是这么做的,比如之前的长亭 WAF 就是直接输入 OTP 就行,但是后面更新加入了先输入用户名密码再输入 OTP 的逻辑
|
![]() |
11
est OP |
![]() |
13
cinlen 64 天前
|
14
leonshaw 64 天前
服务端要存 TOTP secret ,拖库直接 G
|
15
leonshaw 64 天前
另外虽然可以限制 IP 、账号的登录尝试间隔,但是我可以用多个 IP 同时尝试多个账号,根据生日悖论很容易产生碰撞
|
![]() |
16
cinlen 64 天前
密码是用户提供给网站的,泄露了可以修改。 totp secret 是网站提供给用户的,泄露了咋整。
|
![]() |
17
retanoj 64 天前
@cinlen #16
totp 的“根”还是秘钥。既然是秘钥,那在业务逻辑上是可以做到用户提供给网站的。 我觉得 TOTP 做密码的问题在于把密码这个无限的空间压缩到了有限的 6 位数字空间,同时增加了时间限制。 但也面临着有限时间内猜解数字口令,以及在遍历用户碰撞口令的问题。 |
![]() |
18
est OP |
19
likelylee 64 天前
首先 TOTP 有个最大的问题是时间同步,你看一下他的算法就知道了,简单理解就是时间加上用户的唯一序列号做 hash 生成,所以客户端和服务器端要保持时间一致,这也是为什么大部分 TOTP 都是分钟为单位。如果真的做到 10 秒钟,用户这边看到、输入、确认,那边已经超时了比对不一致了。我们早年做过滑动时间窗口做客户端和服务器的时间偏移,但是没有特别的意义。
然后针对脱库这个,库里可以保存用户唯一序列号的强加密数据,这样即使拿到也是加密后的数据。但是加解密也是有时间损耗的,当然不会到秒级,但是用户量大的时候,专门为了登录这个动作而损耗计算时间是否有意义? 最后,现在的合规要求都是多因素,密码+TOTP 是最理想的双因素认证形式。可以考虑在使用 TOTP 的前提下略微降低对密码复杂度的要求,这也是目前部分认证的思路。 再最后,密码这块不要考虑这些有的没的,有任何想法请上 FIDO2 。 |
20
leonshaw 63 天前 via Android
@est 区别就是密码空间比 TOTP 空间大得多。虽然 secret 足够复杂,但是验证码只有 6 位数字,不需要知道序列,只要碰出一次就够了。
|
21
leonshaw 63 天前 via Android
服务端要算出同样的验证码来比较,没办法加盐。除非用某种同态变换,肯定不是现在的算法。
|
![]() |
22
neroxps 63 天前 via iPhone
passkey 现在不是很舒服么
|
23
artiga033 63 天前 via Android ![]() @liuidetmks 微软这个最搞笑,如果你删掉了账号密码,那就无法远程桌面到 Microsoft 账号的 Windows ,因为 rdp 协议目前还只支持经典账号密码
|
![]() |
24
hicdn 63 天前
现在的 passkey 就是在解决这个问题
|
25
azraeljack 63 天前
密码至少还能记住,totp 还得每次掏 authenticator 出来查,这种场景用 passkey 不是更好么。
|
26
hanyuwei70 62 天前
如果是全新系统一律推荐直接上 FIDO2
|
27
MagicalCarl 62 天前
我觉得安全性是可以的,我记得之前的支付宝未登录支付的话只需要输入账户名和 6 位数支付密码即可,支付密码只能尝试五次
|
28
dorothyREN 62 天前
totp 30 秒内 10w 次一定可以登录成功
|