问题描述
|
我需要使用当前时间,因为稍后,另一个程序将需要知道何时生成了密码以及用户名和密码是什么。
摘要:
用户名+密码+当前时间=引脚[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位数字将是非常简单的:)