为了账号安全,请及时绑定邮箱和手机立即绑定

需要一个加密,验证算法

需要一个加密,验证算法

明月笑刀无情 2019-03-01 11:17:13
/**获取随机密码date的格式是年月日yymmdd,privatyKey为10位左右的字母数字组合串1.需要返回8位纯数字2.须使用date,privatyKey来生成3.每次调用都是随机生成的(在date、privatyKey相同的情况下,返回的结果也要不同),尽量保证低重复率**/getPassword(date,privatyKey){ } /**检测密码getPassword生成的密码可以通过检测,随便输入的密码通不过检测**/checkPassword(date,privatyKey,password){ } 有什么合适的算法?
查看完整描述

6 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

1. 从date和privateKey生成一个单向函数,如 `f(num) = SHA256(num ++ date ++ privateKey)` (++表示字符串拼接)
2. 随机生成一个3位数字a, 计算 `b = f(a)`
3. 取 `c = b中的前5位数字`, 返回 `a ++ c`

绕不过去的问题: 8位数字 (1e8 或 2^30) 能放的东西太少了。
所以这个做法几乎完全不抗穷举,攻击者只需固定前3位穷举后5位。
用的时候必须对算法本身保密,或加上尝试次数等限制。


一个略微增加穷举难度的变体:

2. 第一次生成时返回f(1)的前8位数字 第二次生成时返回f(2)的前8位, ...
3. 检验时生成f(1) ~ f(100),检查输入是否属于这个集合
查看完整回答
反对 回复 2019-03-01
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

用MD5试试

查看完整回答
反对 回复 2019-03-01
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

md5,openssl的比较简单

查看完整回答
反对 回复 2019-03-01
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

最终的方案取hash后的一部分值

查看完整回答
反对 回复 2019-03-01
  • 6 回答
  • 0 关注
  • 474 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信