【问题标题】:One-Time-Password in C# expires after a certain period?C#中的一次性密码在一段时间后过期?
【发布时间】:2012-10-24 10:30:16
【问题描述】:

我正在使用 C#.net 为一个网站创建一个登录页面,遇到了一个问题,希望你们能帮助我。

是这样的: 用户来到登录屏幕,然后从那里输入他们的电子邮件,我们将参考数据库以检查其有效性,如果有效,将生成一个随机的 8 位密钥并将其发送到电子邮件。用户现在应该检查他/她的电子邮件以获取“一次性密码”,然后键入一个文本框以继续。

生成和电子邮件发送已完成,但我不知道如何继续执行此操作

我的团队成员之间进行了一些讨论,其中一位提议使用会话超时,然后当单击按钮时,将发送电子邮件,将创建一个会话变量并在其中存储一次性密码,然后我们将使用会话变量引用用户输入的文本框文本,如果正确,他们将被登录。

我想到的另一种方法是使用 Javascript 计时器,然后在网页上使用不可见的标签进行引用。但我不确定 Javascript 是否可以允许这种情况发生..

对于这种情况,您最好的方法是什么?

谢谢!

【问题讨论】:

  • 嗯,必须在此处添加评论,我正在寻找一种无需与数据库交互的方法,因为它更复杂.. 我想知道是否有办法做到这一点存入数据库>

标签: c# asp.net one-time-password


【解决方案1】:

它是时间敏感的,只需将代码存储在具有到期日期时间的数据库中即可。然后,当用户带着他们的令牌回来时,您可以查看它是否尚未过期,如果已经过期,则要求他们重新开始该过程。

【讨论】:

  • 原则上也可以将过期时间以加密形式放入token中。但这很容易出错。
  • @CodesInChaos,这样做在实践中可能没问题,但如果攻击者弄清楚这些过期时间是如何加密的,他/她可能会创建他/她自己的具有自定义过期时间的令牌。相反,假设数据库受到 SQL 注入的保护,这种攻击就会得到缓解。
  • @SpencerDoak 就我个人而言,我喜欢将令牌的哈希值连同到期日期一起存储在数据库中(因此对数据库的读取访问权限不足以了解令牌)。但是在伪造的令牌上生成有效的 MAC 需要泄露存储在服务器上的密钥,这不应该发生,就像攻击者不应该能够访问数据库一样。
  • @CodesInChaos,啊,现在我可以同意了。一次性密码的签名与过期时间一起存储在数据库中确实会更安全。我只是说将到期时间委托给用户(即使它是加密的)可能不是最安全的想法。但同样,我相信你是对的,将令牌的哈希值及其过期时间存储在数据库中是明智的。
猜你喜欢
  • 2014-05-23
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
相关资源
最近更新 更多