1
jkeylu 2013-06-18 19:12:26 +08:00 via Android
放弃这个念头吧骚年
|
2
binux 2013-06-18 19:12:48 +08:00
随便一个hash,base58取8位,over
|
3
Sunyanzi 2013-06-18 19:15:12 +08:00
|
5
kuphrer 2013-06-18 19:25:17 +08:00 via iPad
现有算法(sha-256之类的),加一个自定义密钥头。严格保管密钥头则密码坚不可摧。
|
6
ejin 2013-06-18 20:23:52 +08:00
加个盐值就可以了嘛。
|
7
andybest OP |
8
Sunyanzi 2013-06-18 22:08:57 +08:00 1
|
9
Sunyanzi 2013-06-18 22:09:50 +08:00 1
我也手滑了 orz ... 一段 base10 一段 base52 ... 然后依据第三段的结果拼在一起 ...
|
10
andybest OP @Sunyanzi 感谢,的确可以这样,但这样生成出的密码格式全部相同是不是显得有点搓?
最好能完全随机,无规律性可言的情况下同时包含了大小写与数字 (例如第1个字符可能是数字/大小写,不要第1个字符总是数字这样固定格式) |
11
andybest OP @Sunyanzi “一段 base10 一段 base52 ... 然后依据第三段的结果拼在一起”
“第三段”是什么怎么生成? 根据什么逻辑将base10与base52的两个hash结果拼在一起?结果的密码会是什么样子的? |
13
Sunyanzi 2013-06-18 22:22:02 +08:00 1
|
14
andybest OP |
15
Sunyanzi 2013-06-18 22:46:23 +08:00 1
@andybest 循环 hash 从算法的角度讲不是 保证 肯定会有结果的 ...
虽然概率微乎其微但是依然不是 0 概率不会引发死循环这样 ... 那是个粗暴的办法 ... 组合的逻辑会更精巧复杂一些 ... 效率其实不好说 ... 但我觉得多数情况下是用逻辑拼接来的要快些 ... |
17
breeswish 2013-06-19 07:57:58 +08:00 via Android
先纯数学任意方法hash,然后base52一下将二进制转换为大小写数字
|
18
rrfeng 2013-06-19 08:58:40 +08:00
8位很容易发生碰撞吧?
|
19
andybest OP |
21
lichao 2013-06-19 11:22:21 +08:00
一般来说 SHA256 + 随机盐 就可以应付了
|
23
lichao 2013-06-19 11:32:29 +08:00
@andybest 我觉得既然有现成的 hash 算法了,没必要自己再去实现一个 hash 算法了吧。
而且你不觉得 8 位的 hash 很容易撞车吗? |
25
zoho 2013-06-19 11:41:15 +08:00 1
(1)根据已知 hash 算法生成一个较长的 X 值,分为 7 段;X1 到 X7;
(2)用 X1,X2,X3 分别确定大写字母,小写字母,数字三部分的各自长度; (3)分别用 base26,base26,base10 从 X4,X5,X6 中截取前面三部分的字符; (4)利用 X7 值打乱字符串的顺序。 |
26
andybest OP @zoho 感谢,好想法
请问:(4)利用 X7 值打乱字符串的顺序。 这个是使用X7安排 三部分字符 组合逻辑吗? 这一部分怎么实现可以给个例子吗? 比如X7是xxx, 在base26/26/10分别为xxx的时候如何组合。 就是怎样利用X7组合这三个段? |
27
Sunyanzi 2013-06-19 11:54:26 +08:00 1
@andybest 这个其实交由你自己来决定 ... 我可以提供一个参考思路 ...
假设第三段是个 20 位的 hexstring ... 先取前四位 ... 模 8 取得一个值 ... 如果这个值等于 0 的话继续往下取一位也就是取前五位模 8 ... 直到取得非零值为止 ... 如果十二位都走完了模依然为零 ... 说明这个 hexstring 由 1 0 和 8 组成 ... 我们为这种特殊情况手动定义一个值 ... 比如 3 ... 这个值代表结果中的数字个数 ... 现在假设我们用前五位取到了非零值 ... 以 5 为例吧 ... 后面还剩下十五位 ... 把第三段的开头一位补进来凑够十六位 ... 然后两位一分组 ... 现在我们得到了八个两位的 hexstring ... 前五个 hexstring 模 10 得到五个数字 ... 后三个 hexstring 模 26 得到三个字母 ... 继续处理这八个 hexstring ... 每个 hexstring 取第一位 ... 这代表结果的排序 ... 按照这个排序把我们得到的字母与数字放入对应的位置 ... 假如对应的位置已经有值的话就往后推一位 ... 直到可以放入为止 ... 八位都填入之后 ... 去除没有内容的空位 ... 我们就最终得到了一个肯定包含字母与数字的八位 hash ... 写的比较着急可能有点乱 ... 但大体意思是这样 ... 能看懂么 ..? |
29
zoho 2013-06-19 11:59:25 +08:00 1
@andybest 模运算啊,将 X7 再分为 7 个数,第一个数模 8 得到该选取 8 个字符中第几个字符,第二个数模 7 得到该选取剩下 7 个字符中的第几个字符,一直下去。。。
|
32
notedit 2013-06-19 12:09:12 +08:00 1
从base62中截取6位 其他两位根据一定的算法一个是数字一个是字母
|
33
Sunyanzi 2013-06-19 12:19:14 +08:00 1
@andybest 取模是相对最容易想到的解决方案 ... 对应一般情况也够用 ...
如果考虑到海量样本数量下平衡所有字符的出现率什么的问题 ... 还可以做的更复杂 ... 基本上说到底这就是一个数字到字符的转化 ... 怎么实现还是看个人创意的 ... |
35
wlwood 2018-05-04 15:15:49 +08:00
8 位太短了吧?
|