0

我需要使用当前时间,因为稍后,另一个程序需要知道我何时生成了 pin 以及用户名和密码是什么。

概括:

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

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

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

编辑:

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

4

2 回答 2

5

999999 分钟,约 694 天,约 1.9 年。因此,如果您使用仅用于记录当前时间的所有熵,您将在不到 2 年的时间内循环该值。

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

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

一次性密码没有内部可解码结构,它们通常与普通密码一起用作身份验证的第二个因素。然后可以根据您建议的时间,但不可逆 - 另一端也有密钥,并且可以自己生成可能的列表。

因此,例如,除了输入用户名和(普通)密码外,用户还输入生成为 的令牌中的值AES(secretkey, currentminute),然后服务器计算AES(secretkey, currentminute)AES(secretkey, currentminute-1),以比较该值。它还可能记录哪个令牌匹配,以便它记录令牌时钟精度的估计,这允许令牌时钟的一些漂移,只要它足够频繁地使用。要弄清楚如何最好地使用 6 位密码中的 19 位,您需要一个真正的密码学家——因为我猜想进行简单的截断可能是不安全的。

于 2011-06-01T08:51:44.017 回答
1

作为事后的想法,将我之前的评论推广到答案:

我很确定称它为“otp”是骗人的。OTP 纯粹是随机的和秘密的。

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

你可以

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

我敢肯定,除了使用公钥加密而不是密码之外,这或多或少是 RSA 密钥的做法。

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

于 2011-06-01T08:54:19.603 回答