【发布时间】:2014-06-03 11:08:42
【问题描述】:
我需要一种算法来生成一种 OTP 代码。
6位输出(小数补'0')
没有状态数据(或 DB)
每个号码将至少以 1ms 的间隔(通常为几秒)进行挑选
一个小时后可以重复使用数字
我的第一次尝试:
用当前时间制作种子编号。
17:12:12.033 => (12 * 60 + 12) * 1000 + 33 = 73233enter code here(小时值被删除。所以这有 1 小时的周期)最多6位数,计算999999的提醒。
(73233 mod 999999) + 1= 73234 => 073234但是,不显示顺序增加,在
mod之前乘以一个随机数
((73233 * 123456) mod 999999) + 1 = 62290 => 062290为避免零秒时输出0,请在
mod前添加一个随机数
((73233 * 123456 + 123456) mod 999999) + 1 = 185746
17:00:00.000 => 123457
17:00:00.001 => 246914
17:00:01.000 => 469069
17:01:00.000 => 860197
...
17:59:59.999 => 314956 Wolfram Alpha
它是否足够独特?
我如何声称或证明这个方案在数学上有效?
纠正错误。
【问题讨论】:
-
对于什么来说足够独特?您还需要确保模数和乘数没有公因数(1 除外)。要了解原因,请注意您生成的所有数字都可以被 3 整除。
-
在第 17:12:12.033 => (12 * 60 + 12) * 100 + 33 = 73233 行中,将秒数乘以 100,然后加上毫秒。你的意思是乘以 1000 吗?
-
您需要证明您的算法的正确性还是找到更好的方法?从我的角度来看,第二种选择更具视角。
-
6 位数字最多可编码一百万个数字。更糟糕的是,您每小时需要 60 x 60 x 1000 = 3,600,000 个数字。不合适!每小时 1,000 个数字可以,但随机碰撞的概率至少为 0.001。
-
“每个号码将至少间隔 1 毫秒被挑选” - 这是有保证的,还是你制定了这个规则?
标签: algorithm math random one-time-password