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

Generate unique pin numbers (6 digits) using current time and username + password?

本文关键字:密码 唯一 6位 时间 用户      更新时间:2023-10-16

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

摘要:

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

  • 反转,生成pin,我需要知道具体是哪一个,并检查它是否已经过了1分钟。

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

编辑:

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

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

如果你想包括用户名和密码,避免简单猜测,情况会更糟。

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

一次性密码不具有内部可解码结构,通常除了普通密码外,还使用一次性密码作为身份验证的第二个因素。然后可以根据你建议的时间,但不可逆——另一端也有密钥,可以自己生成可能的列表。

因此,例如,除了输入用户名和(正常)密码外,用户还从生成为AES(secretkey, currentminute)的令牌中输入值,服务器计算AES(secretkey, currentminute)AES(secretkey, currentminute-1)等,以将值与之进行比较。它还可能记录匹配的令牌,以便记录对令牌的时钟精度的估计,这允许令牌的时钟发生一些漂移,只要使用频率足够高。为了找出如何最好地使用6位密码中的19位,你需要一个真正的密码学家——我想,进行简单的截断可能是安全的。

将我之前的评论提升为一个答案,作为事后的想法:

我确信称之为"otp"是骗人的。OTP完全是随机和秘密的。

你所描述的只是一个简单的散列。

你可以

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

我相信除了使用公钥加密而不是密码之外,RSA密钥或多或少就是这样做的

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