参考资源:
https://github.com/ruansheng/technology-study/blob/master/other/otp.md
百度百科:
一次性密码(One Time Password,简称OTP),又称“一次性口令”,是指只能使用一次的密码。一次性密码是根据专门算法、每隔30或60秒生成一个不可预测的随机数字组合。
实现原理:
动态密码是基于时间、口令密钥按照特定的算法所生成的随机数字组合。
现在我们讲一下应用比较广泛的动态密码生成器google-authenticator。
authenticator给我们提供了接入协议,格式如下:
格式:otpauth://totp/52min.net?secret=IH2AGN774DGNNA2N&period=30&digits=8&issuer=Alias
52min.net :密码来源,用于描述密码。
secret :口令种子密钥,每个用户拥有唯一的secret。用户的唯一表示为secret的生成参数。
period :【可选参数】密码的有效时间,默认30S
Digits :【可选参数】密码的长度,默认6字符
issuer :【可选参数】密码别名,用于描述密码。
用户可以根据otpauth://totp/52min.net?secret=IH2AGN774DGNNA2N&period=30&digits=8&issuer=Alias
生成二维码,用于密码生成器扫码获取当前密码。
验证原理:
通过用户输入的标识信息(比如:手机号)生成16位secret。
使用secret通过与密码生成器相同的加密算法,生成password1。
比较用户输入的password 是否与password1相同,如果相同密码有效,反之无效。
代码实现:
<?php
/**
* Class PHPGangsta_GoogleAuthenticator
*/
class PHPGangsta_GoogleAuthentica