怎样写一个hash算法其结果为8位包含大/小写字母和数字?

2013-06-18 19:09:06 +08:00
 andybest
鉴于目前安全事故频发,我打算简单写一个hash算法,输入例如“v2ex”然后算出一个8位包含大小写字母的密码

怎样写这个hash算法?想听听各位的意见 :)
9064 次点击
所在节点    问与答
35 条回复
jkeylu
2013-06-18 19:12:26 +08:00
放弃这个念头吧骚年
binux
2013-06-18 19:12:48 +08:00
随便一个hash,base58取8位,over
Sunyanzi
2013-06-18 19:15:12 +08:00
@binux 说来这个 base58 是咋回事 ... hash 又不需要去除相似字符 ...

不应该用 base62 么 ..?
binux
2013-06-18 19:16:46 +08:00
@Sunyanzi 好吧,我数错了。。
kuphrer
2013-06-18 19:25:17 +08:00
现有算法(sha-256之类的),加一个自定义密钥头。严格保管密钥头则密码坚不可摧。
ejin
2013-06-18 20:23:52 +08:00
加个盐值就可以了嘛。
andybest
2013-06-18 22:04:58 +08:00
@binux @Sunyanzi

谢谢,但是使用base58/62 其中取出8位,理论上是可能不包含数字的吧?
怎样确保取出的8个字符必然包含数字/大小写字母?
Sunyanzi
2013-06-18 22:08:57 +08:00
@andybest 把其他 hash 的结果分成三段 ... 一段 base10 一段 base36 ...

然后用第三段的结果把上两个结果拼在一起 ...
Sunyanzi
2013-06-18 22:09:50 +08:00
我也手滑了 orz ... 一段 base10 一段 base52 ... 然后依据第三段的结果拼在一起 ...
andybest
2013-06-18 22:13:55 +08:00
@Sunyanzi 感谢,的确可以这样,但这样生成出的密码格式全部相同是不是显得有点搓?

最好能完全随机,无规律性可言的情况下同时包含了大小写与数字
(例如第1个字符可能是数字/大小写,不要第1个字符总是数字这样固定格式)
andybest
2013-06-18 22:17:04 +08:00
@Sunyanzi “一段 base10 一段 base52 ... 然后依据第三段的结果拼在一起”


“第三段”是什么怎么生成?
根据什么逻辑将base10与base52的两个hash结果拼在一起?结果的密码会是什么样子的?
binux
2013-06-18 22:19:53 +08:00
@andybest 不满足再hash一次
Sunyanzi
2013-06-18 22:22:02 +08:00
@andybest 为什么会完全相同 ..?

第三段会决定字母和数字的个数以及被拼接到什么位置 ... 这个完全取决于你如何处理呀~
andybest
2013-06-18 22:37:19 +08:00
@Sunyanzi 是。。关键是怎么组合,这个组合逻辑岂不是相当的复杂了?

能否比 @binux 的循环hash取得满足条件的结果更加高效呢?
Sunyanzi
2013-06-18 22:46:23 +08:00
@andybest 循环 hash 从算法的角度讲不是 保证 肯定会有结果的 ...

虽然概率微乎其微但是依然不是 0 概率不会引发死循环这样 ...

那是个粗暴的办法 ... 组合的逻辑会更精巧复杂一些 ...

效率其实不好说 ... 但我觉得多数情况下是用逻辑拼接来的要快些 ...
andybest
2013-06-18 22:59:33 +08:00
@Sunyanzi 恩,你说的对

能否给个怎么用第三段拼接前两段的思路?
breeswish
2013-06-19 07:57:58 +08:00
先纯数学任意方法hash,然后base52一下将二进制转换为大小写数字
rrfeng
2013-06-19 08:58:40 +08:00
8位很容易发生碰撞吧?
andybest
2013-06-19 11:18:54 +08:00
@breeswish baseXX理论人上是有可能是不包含数字或者不包含大/小写字母

除了重新hash还有什么好办法解决?
andybest
2013-06-19 11:19:44 +08:00
@rrfeng 即使8位碰撞机率也基本可以忽略了...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/72810

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX