V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
etre
V2EX  ›  程序员

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

  •  
  •   etre · 2011-12-29 16:46:11 +08:00 · 17286 次点击
    这是一个创建于 4495 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如何安全的保存salt?存在其他地方,程序中等等?
    66 条回复    1970-01-01 08:00:00 +08:00
    dndx
        1
    dndx  
       2011-12-29 16:48:52 +08:00
    个人理解,Salt似乎不需要什么特殊的保存措施。
    Salt主要是想让彩虹表失效,它不能阻止密码被破解,但是应用了Salt后,哪怕是123456这样的简单密码,黑客也要从头跑起,从而大大增加破解难度。
    所以Salt不需要安全的保存,直接写在程序里即可。
    master
        2
    master  
       2011-12-29 16:50:44 +08:00
    通上,当然还可以强化的就是对于不同帐号的密码用不同的salt,可以让破解不同的密码都需要重头跑
    clino
        3
    clino  
       2011-12-29 16:53:08 +08:00
    @dndx 黑客如果能拿到数据库,能拿到代码的可能性也比较大,那在代码里不就能找到 salt 还有算法了
    summic
        4
    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
        5
    skydark  
       2011-12-29 16:58:55 +08:00
    @clino 让黑客知道Salt也没关系,salt主要是为了防御彩虹表。
    推荐一篇:http://hi.baidu.com/caoz/blog/item/edcc36d3f812891e3af3cf28.html
    CoX
        6
    CoX  
       2011-12-29 16:59:38 +08:00
    @clino 同意 @dndx 的说法, 加salt只是增加破解难度吧。
    当然最好还是做好安全工作,如果能拿到代码,其实也不用看算法,在后台额外保存一份明文密码就可以了。
    skydark
        7
    skydark  
       2011-12-29 17:00:17 +08:00
    4# +1, 固定salt也是不安全的。
    CoX
        8
    CoX  
       2011-12-29 17:07:39 +08:00
    服务器被拿下了,什么算法都不安全
    dndx
        9
    dndx  
       2011-12-29 17:08:07 +08:00
    @clino 算法就用公开哈希算法,比如MD5,这个无所谓。比如123456加密后是e10adc3949ba59abbe56e057f20f883e
    反查起来相当容易,但是假如加上一个叫做ewjpiojdewpoiqnjvcpowq的Salt,那么就变成
    123456ewjpiojdewpoiqnjvcpowq,哈希值是:
    2c4a3f980237b1b482f7c258637f9c41
    这个哈希在任何彩虹表里都是查不到的。黑客如果特别想要破解密码,只能用你的Salt重建彩虹表,但是,更多黑客会选择直接放弃破解。
    clino
        10
    clino  
       2011-12-29 17:16:54 +08:00
    @skydark 你推荐的这篇有提到:"只要你的加密算法是固定的,而且是黑客所能掌握的(比如固定salt被黑客知道),那么黑客跑一个常规密码档是非常快的,在这种情况下,你的用户库账号越多,黑客投入产出比越有价值,虽然没有cmd5这么庞大的碰撞库,但是用一天跑一个几千万乃至过亿常用密码的碰撞库,专门来对付你的数据库,也是很值得的事情,这种破解率,会很容易达到60%,有些朋友在微博反馈里说70%,大概也是这种类型"
    summic
        11
    summic  
       2011-12-29 17:17:13 +08:00
    @dndx 知道了salt,黑客用现在已经泄漏的CSDN、天涯明文密码做字典,生成自己的彩虹表轻而易举
    kojp
        12
    kojp  
       2011-12-29 18:00:29 +08:00
    @summic

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

    再扯出另一方面,建议用Bcrypt取代md5/sha
    cxh116
        19
    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
        20
    lwjef  
       2011-12-29 19:04:08 +08:00
    我也觉得MD5不适合加密 用来快速校验的吧
    SErHo
        21
    SErHo  
       2011-12-29 19:16:54 +08:00
    类似WordPress的,直接将salt和加密的密码拼在一起存起来。
    yyfearth
        22
    yyfearth  
       2011-12-29 19:46:08 +08:00
    @kongruxi @cxh116 @SErHo 这样的话,泄露hash后的密码同时,salt也就必定泄露了。不过对抗彩虹表倒是有些用处,比固定的好。
    yyfearth
        23
    yyfearth  
       2011-12-29 19:48:09 +08:00
    但是,一个用户一个salt话,给验证带来了麻烦。
    9hills
        24
    9hills  
       2011-12-29 19:50:51 +08:00
    @yyfearth 如果每个用户一个salt的话,泄露就泄露了吧,有黑客蛋疼到给每个用户都跑一遍彩虹表么。。。


    建议salt直上40位。然后抛弃md5,用sha1啥的。。。。
    yyfearth
        25
    yyfearth  
       2011-12-29 20:10:07 +08:00
    @kongruxi Bcrypt 确实不错,hash代价很高,就连服务器本身估计都够呛的,不要说爆破了。
    @9hills 固定salt直接用binary keyfile。如果每个用户独立salt话,我觉得可以和hash后的长度相同,方便存储和分割。
    觉得和hashed password合并在一起比较好,这样如果仅仅db被盗,还看不出个所以然来。
    md5早就该放弃了,sha的话,sha512还是比较好的,256也不错,要求不高的话sha1也勉强。如果不追求性能的话,bcrypt挺好,我下次试试。
    bhuztez
        26
    bhuztez  
       2011-12-29 20:16:44 +08:00
    @9hills salt再长也挡不住人家拿着高频密码或者弱密码一个个试过来,试不出来就放弃的策略。
    9hills
        27
    9hills  
       2011-12-29 20:22:09 +08:00
    @yyfearth 当然你可以每个用户一个salt,然后再来一个固定salt。。
    @bhuztez 每个用户一个salt啊,那得试到哪辈子去了。。

    差不多就行了,黑客也是讲投入产出的,一天才能破一个用户,还必须的是弱密码。你当黑客是傻子么
    bhuztez
        28
    bhuztez  
       2011-12-29 20:28:22 +08:00
    @9hills 你也太低估现在的显卡了,有个估算表,你可以参考一下 http://golubev.com/gpuest.htm
    yyfearth
        29
    yyfearth  
       2011-12-29 20:34:51 +08:00
    @9hills 混合真是个好主意。sha512的话,sha512(512bit的随机salt+ps+1024Byte二进制keyfile) + 512bit的随机salt 得到1024bit的hash结果(sha256的话就是512bit)很恐怖啊~!
    @bhuztez 说的一个个试,是可行的(比如就难123456去黑一个一般的论坛,绝对命中一大把,要是支付宝这种,估计没戏)
    前提是:系统没有限制校验的次数而且速度比较快(在服务器端限制)
    或者 得到了确切的算法,比如盗取了服务器脚本文件(php之类)或者反编译(java、.net之类)。这样就算是有单一salt,也无法阻止用字典爆破,除非用bcrypt这种非常“慢”的hash。
    9hills
        30
    9hills  
       2011-12-29 20:36:38 +08:00
    @bhuztez 注意我说的是一个用户一个salt。

    黑客算出所有的 8位简单密码(纯数字小写字母) + salt 的彩虹表你觉得要花多长时间,你自己算一下吧

    一个彩虹表只能用一次,下一个用户还得重新算一个
    9hills
        31
    9hills  
       2011-12-29 20:39:38 +08:00
    @yyfearth 我觉得网站也有责任,应该在本地就用js不允许使用弱密码。

    8位以上,不允许纯数字,然后配合每个用户一个单独的40位salt,想安全再加一个固定salt

    以目前的计算机水平,普通黑客就算拿到你的数据库,想算出来也基本不可能
    bhuztez
        32
    bhuztez  
       2011-12-29 20:40:07 +08:00
    @9hills 不是这个策略。比如CSDN存的是 SHA1(salt + password) ,有人拿到了 600W 帐号,对他来说,更好的策略是先算 600W帐号 SHA1(salt+'12345678') 而不需要分别计算彩虹表。
    9hills
        33
    9hills  
       2011-12-29 20:42:11 +08:00
    @bhuztez 本地用js禁止弱密码不就行了。8位以上带字母,算去吧
    yyfearth
        34
    yyfearth  
       2011-12-29 20:43:56 +08:00
    @9hills @bhuztez 就目前而言,每个用户不同salt基本上可以杜绝彩虹表的使用。但是要爆破还是可以的。
    GPU的话,如果知道明确的算法,还是可以比较迅速的爆破出简单密码。
    如果用上量子计算机的话,大部分密码都可以算出来。
    不过总的来说,要同时盗取db和程序,还是比较难的。如果仅仅盗取db,猜不对算法,要爆破也不容易。
    dongbeta
        35
    dongbeta  
       2011-12-29 20:45:45 +08:00
    我们明文保存,你们继续……
    bhuztez
        36
    bhuztez  
       2011-12-29 20:47:07 +08:00
    @yyfearth 量子只是特别适合攻击RSA。对于别的类型的计算还没找到有效的算法。所以是另一个问题。
    yyfearth
        37
    yyfearth  
       2011-12-29 20:47:16 +08:00
    @bhuztez 独立salt,仅仅是对付彩虹表。
    字典爆破是完全另外一种,只能靠加大hash计算量来阻止。但是这样的同时,程序的性能也大大降低。(但是相对影响肯定是爆破要大得多)
    前面提到的bcrypt,就同时提供了这2种方法的解决方案。
    likuku
        38
    likuku  
       2011-12-29 20:47:17 +08:00
    我们明文保存,你们继续…… +10086
    likuku
        39
    likuku  
       2011-12-29 20:47:48 +08:00
    我们明文保存,你们继续…… +10086
    9hills
        40
    9hills  
       2011-12-29 20:48:07 +08:00
    @yyfearth 本地一定要做js弱密码验证。。。要不就和CSDN一样全是123456789.....

    不知道有没有现成的js弱密码验证库可用,把这些都给禁了:
    QWERTYUIOP
    !@#$%^&*(
    ....
    bhuztez
        41
    bhuztez  
       2011-12-29 20:48:11 +08:00
    @yyfearth hash消耗计算能力过多,你就等着被DDoS吧
    yyfearth
        42
    yyfearth  
       2011-12-29 20:50:06 +08:00
    @dongbeta 对于用户而言,如果每个账号,密码都不一样,就算明文保存也不怕泄露。大不了从新生成一个。
    我还用过用get明文发送用户名密码的系统呢~!(当然是玩玩)
    9hills
        43
    9hills  
       2011-12-29 20:51:45 +08:00
    @bhuztez 限制登录就好了,连续五次密码错误封ip 30min。

    discuz都有这功能
    9hills
        44
    9hills  
       2011-12-29 20:51:57 +08:00
    @bhuztez 限制登录就好了,连续五次密码错误禁止ip登录 30min。

    discuz都有这功能
    yyfearth
        45
    yyfearth  
       2011-12-29 20:58:32 +08:00
    @bhuztez @9hills 所以就要权衡。比如hash计算消耗的时间比原来直接用md5的慢上个几倍,效率并不会减低太多。但是对于破解者而言就效率就降低很多很多了。
    限制次数也无法阻止大规模分布式的DDoS,不过相比没有来说会好很多。
    bhuztez
        46
    bhuztez  
       2011-12-29 21:00:55 +08:00
    @yyfearth 所以负责任的态度是只能选择不存,因为快的要被暴破,慢的要被DDoS
    9hills
        47
    9hills  
       2011-12-29 21:04:41 +08:00
    @bhuztez 不存密码?

    世界上的事情都是权衡出来的,什么叫快的被暴破,慢的被DDOS

    用上我上面说的那些方法,一般的黑客就已经无可奈何了。

    你非要说假如大规模DDOS如何如何,假如别人用集群计算如何如何。。。当自己是Google啊,那么招人恨?
    yyfearth
        48
    yyfearth  
       2011-12-29 21:05:10 +08:00
    @bhuztez 如果啥时候可以发明不需要密码,而且又不麻烦的的authentication的方法,绝对是一次技术革命啊。
    目前来说有指纹、面部、瞳孔。但是都不是很靠谱,而且都不如密码效果好。
    我相信,如果读脑技术出现,可以解决这个问题。
    bhuztez
        49
    bhuztez  
       2011-12-29 21:06:18 +08:00
    @yyfearth 不能,因为设备可以伪造,哈哈哈
    yyfearth
        50
    yyfearth  
       2011-12-29 21:06:45 +08:00
    @9hills 别说,还真有不需要密码的网站,用cert数字证书,绝对比密码靠谱。不过相比之下使用更加麻烦。
    9hills
        51
    9hills  
       2011-12-29 21:09:54 +08:00
    @yyfearth 还有成本问题呢,数字证书怎么保证安全性,和银行一样搞USB key么?
    USBkey的成本谁掏,做一个简单的网站,比如v2ex,然后上个USBkey,搞笑~

    世上没有绝对的安全,只有相对的安全。假如都像@bhuztez这样抬杠,人类回到原始社会算了。
    bhuztez
        52
    bhuztez  
       2011-12-29 21:10:42 +08:00
    @9hills 因为很难权衡,随着时间推移安全的长度会逐渐变长,你得选择一个合适的策略,在合适的时候让用户换密码。
    dndx
        53
    dndx  
       2011-12-29 21:11:28 +08:00
    @yyfearth 对,农行的网银就是这样,插上USBKEY就有个Personal证书,拔掉就没了。
    登录时选择证书就可以直接登录。
    yyfearth
        54
    yyfearth  
       2011-12-29 21:12:52 +08:00
    @bhuztez 如果把特定脑电波的pattern作为密码,由于数据量极大,而且可能很难模仿,相当于用非常非常长的密码,这样爆破几乎不可能了。(当然,那时候的计算机估计也可以到把我们目前所有密码爆破的能力)
    用设备伪造前提是窃取了传输的信息或者在本地窃取(相当于keylogger),那是客户端和传输的问题了,那个对于服务器端就完全没辙。
    ofan
        55
    ofan  
       2011-12-29 21:13:54 +08:00
    脑波都出来了... 我来发动动波 ============>------
    bhuztez
        56
    bhuztez  
       2011-12-29 21:14:55 +08:00
    @9hills 安全策略本来就只能在确定你需要的安全等级后,相互challenge,排除了所有疑问之后才可以指定的。看看选个AES,到后面剩下几个选项在当时都没有哪怕不太明显的漏洞了,不还得继续相互challenge。
    yyfearth
        57
    yyfearth  
       2011-12-29 21:16:14 +08:00
    @dndx 但是就算是有证书,也往往还是要个密码,因为如果证书被盗,还有一层保障。除非2者一起被盗。
    其实,现在大多增加安全性的方法,就是多种方法一起用。虽然麻烦了些,但是也更加要保障。比如手机的验证码,usbkey,数字证书,数字令牌,再加上传统的密码。
    唉,扯太远了,睡觉去。
    yyfearth
        58
    yyfearth  
       2011-12-29 21:18:48 +08:00
    @9hills 弱密码验证库 可以直接用这次泄密的统计数据啊
    yyfearth
        59
    yyfearth  
       2011-12-29 21:20:12 +08:00
    @yyfearth 但是这样,有时候用户仅仅是想注册个号进去一下的话,就搞得用户很麻烦了。其实csdn那么多123456就是因为这个原因。
    clowwindy
        60
    clowwindy  
       2011-12-29 21:22:24 +08:00
    用户设置和修改密码时产生一个纯随机salt,明文保存。这样所有用户的密码hash就都不一样了,无法生成反查表。
    delectate
        61
    delectate  
       2011-12-29 21:23:10 +08:00
    用户名哈希值作为salt就挺好。
    base64,sha1神码的都用上呗。
    封ip不好,不如说:
    1.验证码
    2.三次机会。就算三次之后输对了,也提示错误。
    skywinger
        62
    skywinger  
       2011-12-29 21:53:23 +08:00
    用非对称且相同明文每次加密密文都不同的RSA算法岂不是更好?
    bhuztez
        63
    bhuztez  
       2011-12-29 22:04:06 +08:00
    @skywinger RSA如何做到相同明文每次加密密文不同,表示不解
    xi4nyu
        64
    xi4nyu  
       2011-12-30 10:09:29 +08:00
    @skywinger 能保证私钥的绝证安全么?
    skywinger
        65
    skywinger  
       2011-12-30 11:24:31 +08:00
    @bhuztez 这就是非对称算法的特殊之处,有一些特定的随机因子,所以可能每次加密的密文不同,但是私钥能解的开。
    skywinger
        66
    skywinger  
       2011-12-30 11:26:01 +08:00
    @xi4nyu 如果你采用硬件加密设备如HSM(硬件加密机)来存储加密密钥或是存储密钥的话,就非常安全了,而且是金融级别的安全性,银行都这么干的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2505 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 15:37 · PVG 23:37 · LAX 08:37 · JFK 11:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.