需要一个加密,验证算法

发布于 2022-09-04 17:45:18 字数 354 浏览 9 评论 0

/**
获取随机密码
date的格式是年月日yymmdd,privatyKey为10位左右的字母数字组合串
1.需要返回8位纯数字
2.须使用date,privatyKey来生成
3.每次调用都是随机生成的(在date、privatyKey相同的情况下,返回的结果也要不同),尽量保证低重复率
**/
getPassword(date,privatyKey){

}

/**
检测密码
getPassword生成的密码可以通过检测,随便输入的密码通不过检测
**/
checkPassword(date,privatyKey,password){

}

有什么合适的算法?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

怎樣才叫好 2022-09-11 17:45:18
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),检查输入是否属于这个集合
二智少女 2022-09-11 17:45:18

可以用一个现成的哈希函数(比如sha256)作用在(date, pkey)上。结果一般远超出8位纯数字的信息。把这些信息分割成小段随机返回一段。

getpass(date, pkey) {
  passwords[10] = sha256(date, pkey);
  return passwords[random(1,10)];
}

checkpass(date, pkey, pass) {
  passwords[10] = sha256(date, pkey);
  return (pass in passwords);
}
难理解 2022-09-11 17:45:18

用MD5试试

神也荒唐 2022-09-11 17:45:18

如果要返回结果每次都不一样的话可以采用TripleDes

但是结果只能是8位纯数字,这个就够呛了

悲歌长辞 2022-09-11 17:45:18

md5,openssl的比较简单

才能让你更想念 2022-09-11 17:45:18

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文