我知道 TOTP 的概念适用于要验证代码的设备与要生成代码的设备分开的情况。
但是,我想知道使用 TOTP 算法生成用于电子邮件/电话号码验证的验证码是否是一个坏主意(其中代码在服务器的同一设备上生成和验证)。
我知道 TOTP 的概念适用于要验证代码的设备与要生成代码的设备分开的情况。
但是,我想知道使用 TOTP 算法生成用于电子邮件/电话号码验证的验证码是否是一个坏主意(其中代码在服务器的同一设备上生成和验证)。
你可能可以,但这没有多大意义。电子邮件甚至 SMS 可能需要足够长的时间才能到达人们 - 甚至是明确检查消息的人 - 您需要检查最后几分钟的代码,这扩大了允许值的范围并略微增加了风险攻击者猜测/暴力破解代码。同时,TOTP 的全部意义——生成者和验证者不需要任何通信渠道,只需要两条公共信息(密钥和时钟)——在这里没有实际意义。
相反,只需使用加密安全(伪)随机数生成器生成一个短代码并将其发送给接收者,并简单地存储它(可能以散列形式)。您可以使用数据库,或者如果由于负载平衡等不会造成问题,则将其存储在 RAM 或缓存中。这样只有一个有效值,您可以随时立即撤销它(例如一次它被使用,一旦它过期,或者如果你检测到多次失败的尝试),并且没有持久的秘密(TOTP 密钥)可以被攻击者窃取来生成所有未来的代码。您还可以轻松地更改您的代码 - 更改它们的字符集、长度、生成方式等 - 任何时候感觉很重要。
附带说明一下,如果您的网站/服务有任何高度敏感的数据 - 支付信息、敏感的 PII 等 - 请不要使用任何基于 SMS 的内容作为唯一的身份验证因素。SMS 不是很安全,而且移动电话运营商在重新发行您的 SIM 卡(或以其他方式转移您的号码)之前验证您的身份也是出了名的糟糕,因此拥有给定的电话号码并不是身份的有力证明。甚至美国政府的指导方针(在许多情况下都落后于时代)说您需要提供 SMS 的替代方案,并向用户解释选择 SMS 进行身份验证(假设您提供它)是有风险的。SMS 是可以接受的——尽管仍然不理想——作为身份验证的第二个因素,最常见的是与记忆的标识符(密码/PIN)结合使用。