使用当前时间和用户名+密码生成唯一的密码(6位)?

时间:2011-06-01 08:46:35

标签: c++ otp

我需要使用当前时间,因为稍后,另一个程序需要知道我何时生成了引脚并且输入了用户名和密码。

要点:

  • 用户名+密码+当前时间=图钉[6位]

  • 反向生成别针,我需要知道哪个特定,并检查它是否已经过了1分钟。

我不是要求直接代码,但我需要知道最好的,而不是最好的方法/算法。谢谢(顺便说一下,我是cpp初学者)

编辑:

我很抱歉没有说清楚。实际上,我需要OTP,在生成引脚后,其他程序需要像这样运行:validate {username} {password} {pin}

2 个答案:

答案 0 :(得分:5)

999999分钟,给出~694天,~1.9岁。因此,如果您使用所有可用的熵来记录当前时间,那么您将在不到2年的时间内循环该值。

如果您想要包含用户名和密码,并且避免轻易猜测,情况会更糟。

使用6位十进制数字,可以存储大约19位数据。因此,您必须确保在服务器端具有强大的反暴力保护,否则尝试所有可能的组合将是微不足道的。

One-time passwords没有内部可解码结构,除了普通密码外,它们通常用作身份验证的第二个因素。然后可以基于您建议的时间,但不可逆 - 另一端也有密钥,并且可以自己生成可能的列表。

因此,例如,除了输入用户名和(普通)密码之外,用户还会输入来自令牌的值,该令牌生成为AES(secretkey, currentminute),服务器会计算AES(secretkey, currentminute)和{ {1}}等,以比较值。它还可以记录哪个令牌匹配,以便记录令牌时钟精度的估计值,这样可以使令牌的时钟有一些漂移,只要它经常使用得足够频繁。要想知道如何最好地使用6位数字中的19位,你需要一个真正的密码学家 - 正如我猜想的那样,简单的截断可能是安全的。

答案 1 :(得分:1)

作为事后的想法,提升了我之前对答案的评论:

  

我很确定这称'otp'是骗人的。 OTP纯属随机和秘密。

     

您描述的是一个简单的哈希。

     

你可以

 MD5(username+password_hash+(seconds_past_1970%60))
  

我确信除了使用公钥加密而不是密码之外,这或多或少都是RSA密钥的用途。

编辑哦是的:从生成的哈希生成6位数字将非常简单:)