0

在我的 python 项目中,我打算使用 TOTP。

新用户输入他的电子邮件。然后他收到使用 TOTP 生成的 OTP。

import pyotp
totp = pyotp.TOTP('base32secret3232')
totp.now() # => '492039'

OTP 有效期为 30 秒。

现在可以输入假电子邮件并使用相同的 OTP,有效期至 30 秒。

totp.verify('492039') # => True

那么如何保护免受此类事情的影响。

在验证用户的电子邮件之前,我不想将第一次用户保存在数据库中

4

1 回答 1

2

来自PyOTP 文档

至少,应用程序实施者应遵循以下清单:

...

  • 通过拒绝客户端使用的一次性密码来拒绝重放攻击(这需要在数据库中存储最近经过身份验证的时间戳、OTP 或 OTP 的哈希,并在看到匹配时拒绝 OTP)

...

因此,当使用 TOTP 时,您必须存储一些东西。没有办法解决这个问题。

另请注意,对于基于电子邮件的 OTP 来说,30 秒是一个相当短的时间。如果邮件服务器只是有点慢,OTP 就会过期。


有另一种验证电子邮件地址的方法,不需要您存储任何内容。在电子邮件中,包含一个带有查询参数的链接,该参数使用只有您的服务器知道的密钥进行加密。在加密数据中,包括电子邮件地址和注册时间戳。服务器对此进行解密,检查时间戳是否仍在可接受的范围内,并将电子邮件地址添加到数据库中。

从理论上讲,甚至没有理由加密;签署将达到目的。但是客户端不需要知道URL的内容,所以我们不妨不透露。

于 2020-02-04T09:53:34.483 回答