因此,作为项目的一部分,我想实现一个两步认证系统(在rails中)
我理解它的原理,
=>客户:用户名和密码
< =服务器:生成PIN码并通过短信/电子邮件发送给客户
=>客户:输入PIN
< =服务器:正常验证客户端
现在我想知道的是基于网络的应用程序,例如rails,PIN需要在每个点保密,所以当从用户名/密码部分重定向到PIN部分时,我需要保留PIN码将代码秘密传递给系统的下一部分(PIN部分)
通过将PIN暂时存储在数据库中以及用户ID,这是唯一可行的方法吗?
答案 0 :(得分:2)
不,不是那么。
有两种(最常用)类型的一次性密码(OTP,您的术语中的PIN):
基于时间的(TOTP)根据当前时间(例如:1970.1.1 00:00的30秒间隔的数量)和一些共享秘密生成一些数字。当收到这样的一次性密码时,服务器会生成一个密码并检查它是否正确。
在基于计数器的OTP中,您有一个计数器和一个密钥存储在靠近用户ID的数据库中,它用于生成OTP。它可以根据登录尝试递增。
基于时间的令牌通常更好,因为它们不需要计数器同步(时间同步通常更容易)。最好的例子是Google Authenticator,它实现了RFC6238的标准TOTP。
有一个Ruby OTP库声称与Google Authenicator兼容,您可能想尝试一下:link
无法保证其安全性和/或质量,但看起来很有希望。