/**
获取随机密码
date的格式是年月日yymmdd,privatyKey为10位左右的字母数字组合串
1.需要返回8位纯数字
2.须使用date,privatyKey来生成
3.每次调用都是随机生成的(在date、privatyKey相同的情况下,返回的结果也要不同),尽量保证低重复率
**/
getPassword(date,privatyKey){
}
/**
检测密码
getPassword生成的密码可以通过检测,随便输入的密码通不过检测
**/
checkPassword(date,privatyKey,password){
}
有什么合适的算法?
绕不过去的问题: 8位数字 (
1e8 或 2^30
) 能放的东西太少了。所以这个做法几乎完全不抗穷举,攻击者只需固定前3位穷举后5位。
用的时候必须对算法本身保密,或加上尝试次数等限制。
一个略微增加穷举难度的变体:
可以用一个现成的哈希函数(比如sha256)作用在
(date, pkey)
上。结果一般远超出8位纯数字的信息。把这些信息分割成小段随机返回一段。用MD5试试
如果要返回结果每次都不一样的话可以采用TripleDes
但是结果只能是8位纯数字,这个就够呛了
md5,openssl的比较简单
最终的方案取hash后的一部分值