现在智能锁有很多,特别是一些小杂品牌,并没有自己的APP或微信小程序。其生成一次性密码都是依靠一些通用的APP或小程序。因此,其算法其实是固定的。
一般来说,有计时功能的智能锁,一次性临时密码是以时间、管理密码为参数,通过不可逆的算法,生成一串数字,提供给用户。同样,智能锁这一端用相同的算法,计算一串数字,如果与输入匹配,则验证通过,门打开。
考虑到手机与门锁时间的精准度,一般允许二者时间误差在10分钟以内。这样,手机在计算的时候,时间取值到分钟,分钟的个位取值只为0和5,在5分钟内计算的是相同的值。智能锁端,则另外再计算前后5分钟的2个值。用户输入与智能锁计算的这3个值的任一个相同则验证通过。有的锁设置了此密码只能使用一次,验证后会暂时记下这个密码,在有效期内再次输入无效。当然,过了10分钟中的有效期,本身就验证不会通过了。
如果用JS写,大概是这样的:
//取得分钟值,并将个位调整为0和5
var minutes =parseInt( (new Date()).getTime()/1000/60/5)*5;
//管理密码
var ps=123456;
//计算MD5
var value=md5(minutes * ps);
//取临时密码
var code="0000000"+parseInt(value.substring(0,7),16).toString();
code=code.substring(code.length-8,code.length);
由于算法是不可逆的,因此,临时密码本身 是无法推算管理密码的,由于使用了时间作为计算参数,临时密码基本上不会重复(这个与其计算取值的方法有关)。所有临时密码是离线的,也是安全的。
小荷作文网原创,有问题请联系 xhzww@126.com