使用当前时间和用户名+密码生成唯一的密码(6位)
Generate unique pin numbers (6 digits) using current time and username + password?
我需要使用当前时间,因为稍后,另一个程序需要知道我何时生成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位数字将非常简单:)
- 何时在引用或唯一指针上使用移动语义
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 计算排序向量的向量中唯一值的计数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 通过组合不同的类型来创建唯一的id
- 使用Unique_ptr确保工厂中的对象唯一
- c++多进程编写一个唯一的文件
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- c++中的oop(密码生成)
- 密码登录程序将永远循环并显示不正确的结果
- 如何更改唯一指针向量的可见性
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- C++尝试深度复制唯一指针时出现内存访问冲突
- OpenSSL没有共享密码
- 具有引用成员的结构是否具有唯一的对象表示形式
- 使用 RTTI 克隆唯一指针的向量
- 如何在 c++ 中迭代数组中的唯一元素
- Cryptopp:获取密码输入的填充字符串
- 使用当前时间和用户名+密码生成唯一的密码(6位)