/**
获取随机密码
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後的一部分值