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

问题描述

| 我需要使用当前时间,因为稍后,另一个程序将需要知道何时生成了密码以及用户名和密码是什么。 摘要用户名+密码+当前时间=引脚[6位数字] 反向生成的图钉,我需要知道具体的哪一个,并检查其是否已经过了1分钟。 我不是在要求直接代码,但我需要了解最好的方法,而不是说最好的方法。谢谢(顺便说一句,我是cpp初学者) 编辑: 对不起,我没有弄清楚。实际上,我不希望使用OTP,在生成引脚后,其他程序将需要像这样运行:validate {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位数字将是非常简单的:)