密码泄路很疯狂,很多密码加密都使用了salt,如何安全的保存salt呢?

2011-12-29 16:46:11 +08:00
 etre
如何安全的保存salt?存在其他地方,程序中等等?
17541 次点击
所在节点    程序员
66 条回复
dndx
2011-12-29 16:48:52 +08:00
个人理解,Salt似乎不需要什么特殊的保存措施。
Salt主要是想让彩虹表失效,它不能阻止密码被破解,但是应用了Salt后,哪怕是123456这样的简单密码,黑客也要从头跑起,从而大大增加破解难度。
所以Salt不需要安全的保存,直接写在程序里即可。
master
2011-12-29 16:50:44 +08:00
通上,当然还可以强化的就是对于不同帐号的密码用不同的salt,可以让破解不同的密码都需要重头跑
clino
2011-12-29 16:53:08 +08:00
@dndx 黑客如果能拿到数据库,能拿到代码的可能性也比较大,那在代码里不就能找到 salt 还有算法了
summic
2011-12-29 16:57:14 +08:00
安全的salt应该是每个用户单独的salt,而不是所有用户用固定的salt

看这篇文章

http://stackoverflow.com/questions/6340105/how-can-we-create-a-fairly-secure-password-hash-in-php
skydark
2011-12-29 16:58:55 +08:00
@clino 让黑客知道Salt也没关系,salt主要是为了防御彩虹表。
推荐一篇:http://hi.baidu.com/caoz/blog/item/edcc36d3f812891e3af3cf28.html
CoX
2011-12-29 16:59:38 +08:00
@clino 同意 @dndx 的说法, 加salt只是增加破解难度吧。
当然最好还是做好安全工作,如果能拿到代码,其实也不用看算法,在后台额外保存一份明文密码就可以了。
skydark
2011-12-29 17:00:17 +08:00
4# +1, 固定salt也是不安全的。
CoX
2011-12-29 17:07:39 +08:00
服务器被拿下了,什么算法都不安全
dndx
2011-12-29 17:08:07 +08:00
@clino 算法就用公开哈希算法,比如MD5,这个无所谓。比如123456加密后是e10adc3949ba59abbe56e057f20f883e
反查起来相当容易,但是假如加上一个叫做ewjpiojdewpoiqnjvcpowq的Salt,那么就变成
123456ewjpiojdewpoiqnjvcpowq,哈希值是:
2c4a3f980237b1b482f7c258637f9c41
这个哈希在任何彩虹表里都是查不到的。黑客如果特别想要破解密码,只能用你的Salt重建彩虹表,但是,更多黑客会选择直接放弃破解。
clino
2011-12-29 17:16:54 +08:00
@skydark 你推荐的这篇有提到:"只要你的加密算法是固定的,而且是黑客所能掌握的(比如固定salt被黑客知道),那么黑客跑一个常规密码档是非常快的,在这种情况下,你的用户库账号越多,黑客投入产出比越有价值,虽然没有cmd5这么庞大的碰撞库,但是用一天跑一个几千万乃至过亿常用密码的碰撞库,专门来对付你的数据库,也是很值得的事情,这种破解率,会很容易达到60%,有些朋友在微博反馈里说70%,大概也是这种类型"
summic
2011-12-29 17:17:13 +08:00
@dndx 知道了salt,黑客用现在已经泄漏的CSDN、天涯明文密码做字典,生成自己的彩虹表轻而易举
kojp
2011-12-29 18:00:29 +08:00
@summic

同意 ~~~
skydark
2011-12-29 18:29:54 +08:00
@clino 所以我补充了7楼。
yyfearth
2011-12-29 18:46:12 +08:00
@dndx @summic @kojp @clino 那么如果salt不固定,那么也得存到哪里,如果不存也要一个固定的生成算法,否则下次无法校验。
如果黑客拿到了全部算法和加密数据(如果salt保存,那么肯定也包括在内)
然后根据已经泄密的的数据,根据算法生成彩虹表应该也非常快。
那么除非用户的密码足够强劲,否则都没用啊~!
yyfearth
2011-12-29 18:47:28 +08:00
而且,如果是客户端的hash,不可能不透露hash算法和salt啊。
cxh116
2011-12-29 18:51:00 +08:00
@summic 每个用户一个salt, 假如你的字典有10万, 一个salt就要生成一次,那么10个密码就需要生成10,也就是100万
从某种意义上来讲,增加salt的长度,也可以提高安全性
1212e
2011-12-29 18:55:39 +08:00
如果能拿到你的密码,就一定能拿到你的salt.对吗?
kongruxi
2011-12-29 18:58:45 +08:00
可以考虑一下salt动态生成,比如是:数据库对应记录的id + 程序中的固定字符串

再扯出另一方面,建议用Bcrypt取代md5/sha
cxh116
2011-12-29 19:00:03 +08:00
@etre 问题忘记答了,一般一个用户对应一个salt,也就是说用户名增加一个salt字段就行了.

你看discuz的用户表设计,就有salt字段

http://www.henghome.com/dzx/20110121/pre_ucenter_members.html
lwjef
2011-12-29 19:04:08 +08:00
我也觉得MD5不适合加密 用来快速校验的吧

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

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

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

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

© 2021 V2EX