一次性密码
一次性密码(OTP)是用过一次就失效的密码。固定密码一旦泄露会被反复滥用,而 OTP 用过的验证码无法再次使用,因此对撞库攻击和钓鱼(网络诈骗)的抵抗力更强。
OTP 大致分为两种方式。TOTP(Time-based One-Time Password)根据密钥与当前时刻每 30 秒生成一个 6 位数的验证码。HOTP(HMAC-based One-Time Password)根据密钥与计数器的值生成验证码。当前的主流是 TOTP,Google Authenticator、Microsoft Authenticator 等验证应用都采用它。
二维码在 TOTP 的初始设置中承担着不可缺少的角色。让用户手动输入服务方生成的密钥,等于要敲进一串 32 个字符的 Base32 文本,这并不现实。于是把密钥编码成 otpauth://totp/... 形式的 URI 并显示为二维码,用户只要用验证应用扫一下,密钥就安全地登记进了应用。
这套机制大大推动了双因素验证(2FA)的普及。如果没有靠二维码一步完成的设置,普通用户引入 TOTP 的门槛会高出很多。它是把安全性与易用性同时做好的一个范例。
不过要注意,一次性密码并不是万能的。攻击者把用户引到假的登录页面、当场把输入的验证码转发到真站点,这种实时的中间人钓鱼在 30 秒的有效期内是来得及的。设置时显示的那个二维码里含有密钥本身,截图留在相册里或者转发出去就等于把钥匙交了出去,所以登记完成后应立刻删除。