开发者社区> 问答> 正文

支付宝宝令的时间同步是神马原理。:报错

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跟用户提交的密码进行比对即可

宝令内置计时器,计时器不准后可以在支付宝网站上同步时间。

同步时间步骤:
输入宝令的序号,当前动态密码,下一分钟的动态密码。确认后即可。

他这个同步是怎么同步的。

展开
收起
kun坤 2020-06-06 00:45:27 421 0
1 条回答
写回答
取消 提交回答
  • 我也想知道.######

    可以根据密码反 查出 生成密码的时间戳吧.

    然后服务器端 针对该序列号的宝令 增加一个 时间误差值

    例如 :服务器时间是 12:00 宝令生成的密码时间 12:01 那么服务器端在计算该宝令的密码时把生成的时间戳 +1秒的时间.

    ######回复 @cevin : 当前时间动态 密码 和 下一分钟的动态密码.重复的话即使得到多个时间戳。也应该可以过滤出正确的.######根据密码反查?如果密码组合有重复的呢?而且,密码应该是随机生成的,当然按照原子序列使用指定的内置密码表。也不一定能保证绝无重复啊。######种子 +  时间  --> 加密算法处理 --> 动态口令
    2020-06-06 00:45:31
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
手机京东Crash自动分析处理系统 立即下载
Redis开发实操之春运迁徙页面 立即下载
钉钉小程序——为工作方式插上翅膀 立即下载