OTP的算法如下:
// 生成的密码是多少位 $length = 6; // 密码有效期 单位秒 $expire = 30; // 口令密钥 $secret_key = 'XXXXXXXXXXX'; // 获取服务器当前时间戳 $timestamp = floor(microtime(1)/$expire); // 根据密钥和当前时间计算动态密码 $bc = pack('N*',0).pack('N*',$timestamp); // 获取HASH值 $hash = hash_hmac('sha1',$bc,$secret_key,1); // 进行混码计算 $offset = ord($hash[19]) & 0xf; $secret_code = ( ((ord($hash[$offset+0]) & 0x7f) << 24 ) | ((ord($hash[$offset+1]) & 0xff) << 16 ) | ((ord($hash[$offset+2]) & 0xff) << 8 ) | (ord($hash[$offset+3]) & 0xff) ) % pow(10, $length); // 密码不足$length位补齐 $secret_code = str_pad($secret_code,$length,'0',STR_PAD_LEFT);
// 使用最终生成的$secret_code跟用户提交的密码进行比对即可
宝令内置计时器,计时器不准后可以在支付宝网站上同步时间。我也想知道.######
可以根据密码反 查出 生成密码的时间戳吧.
然后服务器端 针对该序列号的宝令 增加一个 时间误差值
例如 :服务器时间是 12:00 宝令生成的密码时间 12:01 那么服务器端在计算该宝令的密码时把生成的时间戳 +1秒的时间.
######回复 @cevin : 当前时间动态 密码 和 下一分钟的动态密码.重复的话即使得到多个时间戳。也应该可以过滤出正确的.######根据密码反查?如果密码组合有重复的呢?而且,密码应该是随机生成的,当然按照原子序列使用指定的内置密码表。也不一定能保证绝无重复啊。######种子 + 时间 --> 加密算法处理 --> 动态口令版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。