保存密码时需要加盐 Hash 之后保存密文,那么,如果每个密码使用的“盐”不同的话,“盐”怎么保存? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cloudfstrife
V2EX    信息安全

保存密码时需要加盐 Hash 之后保存密文,那么,如果每个密码使用的“盐”不同的话,“盐”怎么保存?

  •  
  •   cloudfstrife 2019-12-17 15:38:21 +08:00 8896 次点击
    这是一个创建于 2135 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言    2019-12-18 10:49:51 +08:00

    总结:
    盐可以明文保存,但是更好的解决方案是bcrypt加密和校验。

    44 条回复    2020-04-28 05:27:59 +08:00
    scukmh
        1
    scukmh  
       2019-12-17 15:41:32 +08:00
    $yourSalt$passwordHash$
    shengchen11
        2
    shengchen11  
       2019-12-17 15:43:29 +08:00
    有些 salt 就是 username 吧
    CloudMx
        3
    CloudMx  
       2019-12-17 15:43:45 +08:00   2
    Bcrypt,可以看看。
    Telegram
        4
    Telegram  
       2019-12-17 15:45:55 +08:00 via iPhone
    对应的盐也存入数据库呗。
    wevsty
        5
    wevsty  
       2019-12-17 15:50:38 +08:00
    salt 可以明文储存在数据库。

    Hash 加盐这种做法要保障安全的话,除了 Hash 算法的选择以外也需要盐足够长,一般认为盐的长度应该和密码长度一样长才行。

    另外目前是更推荐直接用 BCrypt。
    atom234
        6
    atom234  
       2019-12-17 15:51:10 +08:00   1
    用现有字符串字段,如果盐不香,可以放点味精、料酒、蚝油之的
    yisheyuanzhang
        7
    yisheyuanzhang  
       2019-12-17 16:00:01 +08:00
    推荐 Bcrypt
    cyannnna
        8
    cyannnna  
       2019-12-17 16:02:05 +08:00 via iPad
    Bcrypt +10086
    a7217107
        9
    a7217107  
       2019-12-17 16:03:08 +08:00
    bcrypt 不用手动存盐
    anteros
        10
    anteros  
       2019-12-17 16:09:03 +08:00   1
    4 年前流行这做法,现在还用这做法的,可能大部分都是很久没看过新东西的老油条了吧
    qdwang
        11
    qdwang  
       2019-12-17 16:13:10 +08:00
    存在隔壁
    miniliuke
        12
    miniliuke  
       2019-12-17 16:33:47 +08:00
    @php01 现在都流行咋搞
    hwdef
        13
    hwdef  
       2019-12-17 16:40:22 +08:00
    aes(md5(key))
    RyougiShiki
        14
    RyougiShiki  
       2019-12-17 16:57:54 +08:00
    django 自带的 admin 注册个用户到数据库表看一下就明白了,同 1 楼回答。
    jorneyr
        15
    jorneyr  
       2019-12-17 17:01:37 +08:00
    Bcrypt 的弊端就是效率太低,当大批量从文件导入创建用户,且每个用户的密码还不一样时,非常非常慢
    0TSH60F7J2rVkg8t
        16
    0TSH60F7J2rVkg8t  
       2019-12-17 17:06:41 +08:00 via iPhone   1
    @jorneyr 这个效率是故意设置的,防止被脱裤后直接拿来跑字典和彩虹表
    ech0x
        17
    ech0x  
       2019-12-17 17:15:06 +08:00 via iPhone
    ech0x
        18
    ech0x  
       2019-12-17 17:18:41 +08:00 via iPhone
    salthash1 = Bcrypt(password + salt1)
    salthash2 = sha512(salthash1 + salt2)
    其中 salthash1 不能保存在数据库里
    yisheyuanzhang
        19
    yisheyuanzhang  
       2019-12-17 17:21:40 +08:00
    @jorneyr Bcrypt 有个参数影响加密效率( GENSALT_DEFAULT_LOG2_ROUNDS = 10 ),为了防止暴力破解
    xuanbg
        20
    xuanbg  
       2019-12-17 17:56:10 +08:00
    如果每个数据的盐都不同的话,就加一个字段存起来呀。最简单的是用现成的账号 hash 后做盐,这样就不需要额外字段存了。
    cloudfstrife
        21
    cloudfstrife  
    OP
       2019-12-17 18:18:25 +08:00
    TKS ALL。谢谢各位
    no1xsyzy
        22
    no1xsyzy  
       2019-12-17 18:41:15 +08:00
    话说:
    > 每个密码使用的“盐”不同
    为什么前面的是
    > 如果
    啊?难道这不是必须的吗?同盐不还是彩虹表近乎离线破解吗?
    只不过特地给你专门做张表罢了。
    no1xsyzy
        23
    no1xsyzy  
       2019-12-17 18:42:44 +08:00
    @jorneyr 效率低就是优势啊,你快了黑客脱完库破解也快啊
    PopRain
        24
    PopRain  
       2019-12-17 18:44:49 +08:00
    用户名+密码 作为密码, 就不用加“盐”了吧
    Mutoo
        25
    Mutoo  
       2019-12-17 19:29:28 +08:00
    盐是为了对抗彩虹表,可以明文储存。
    Bcrypt 是为了对抗暴力破解,增加遍历组合的时间。
    yh7gdiaYW
        26
    yh7gdiaYW  
       2019-12-17 23:32:08 +08:00 via Android
    之前公司用的是: md5(用户名+md5(密码)+固定的一个字符串)
    zlowly
        27
    zlowly  
       2019-12-18 00:48:49 +08:00   1
    可参见 linux 系统的 /etc/shadow 保存密码的格式
    $ID$SALT$ENCRYPTED
    The $ID indicates the type of encryption, the $SALT is a random (up to 16 characters) string and $ENCRYPTED is a password’s hash.
    Hash Type ID Hash Length
    MD5 $1 22 characters
    SHA-256 $5 43 characters
    SHA-512 $6 86 characters
    conn4575
        28
    conn4575  
       2019-12-18 01:00:49 +08:00 via Android
    bcrypt 还是慎重吧,bcrypt 虽然安全,但是极其消耗 CPU 资源,被攻击时别人可以轻易把你的机器 CPU 打满。
    普通的多个 salt 多重 hash 的方式目前来看已经足够安全,别指望单靠一个 bcrypt 就完全解决密码安全问题,有很多安全策略在里面
    msg7086
        29
    msg7086  
       2019-12-18 02:34:11 +08:00   1
    @conn4575 被攻击时难道不应该解决攻击问题吗?为什么要解决掉 bcrypt ?
    k9990009
        30
    k9990009  
       2019-12-18 07:12:52 +08:00 via Android
    把加密后的密码和随机盐按特定的顺序混合存储
    alphatoad
        31
    alphatoad  
       2019-12-18 07:23:54 +08:00 via iPhone
    盐可以明文存,加盐的意义是防彩虹表
    jinliming2
        32
    jinliming2  
       2019-12-18 08:26:58 +08:00 via iPhone   1
    @conn4575 所以你们服务器的登录服务是可以让攻击者无限尝试不做限制的吗?正常不应该是尝试三次失败出验证码,尝试更多次失败封 IP 的吗?或者增加其他验证机制啊?
    phy25
        33
    phy25  
       2019-12-18 08:34:42 +08:00 via Android
    shiji
        34
    shiji  
       2019-12-18 08:36:15 +08:00
    @conn4575 上验证码就好了。验证码没过就不验密码。 网络服务里面比 BCrypt 更浪费 CPU 的有的是。重复这个操作也一样能把 CPU 打满
    jss
        35
    jss  
       2019-12-18 08:39:01 +08:00 via iPhone
    你该不是来收集我们的加密规则,干别的事吧…
    jzmws
        36
    jzmws  
       2019-12-18 08:39:43 +08:00
    用 id 做盐
    Midnight
        37
    Midnight  
       2019-12-18 08:43:45 +08:00
    @php01 什么 4 年前,10 年前都是这个做法
    jorneyr
        38
    jorneyr  
       2019-12-18 08:50:53 +08:00
    @no1xsyzy 是的,根据业务场景选择合适的更重要,没有银弹
    ryansvn
        39
    ryansvn  
       2019-12-18 09:01:58 +08:00
    iCloud 是个谜,我有一次重置手机之后,云端恢复数据,要求我输入锁屏密码,我的锁屏密码从来没有更换过,一直都是同一个,但是无论如何输入,都说不正确,最后搞得只能 DFU 刷机加上设置为新手机不恢复备份,以前东西全部丢失。
    后来我就把备份功能关闭了,关键时刻掉链子平时占用空间,这种东西,不用也罢。
    cloudfstrife
        40
    cloudfstrife  
    OP
       2019-12-18 10:32:10 +08:00
    @jss 真心不是啊,主要是考虑到盐如果明文保存,会不会再来安全隐患。如果破解是针对指定用户,而不是针对全量用户的,这种情况,如果盐和密文都泄露了。会有一定的风险。
    Vegetable
        41
    Vegetable  
       2019-12-18 10:39:39 +08:00
    明文储存+1
    bluehr
        42
    bluehr  
       2019-12-18 11:29:23 +08:00
    盐是用来防止彩虹表暴力破解的,无需加密存储。
    onice
        43
    onice  
       2020-01-05 12:44:24 +08:00
    数据库表新加一个 salt 字段即可。
    nuk
        44
    nuk  
       2020-04-28 05:27:59 +08:00
    @cloudfstrife 不会啊,不要把 salt 做最终 hash 的一部分, 可以比如这样子
    hash=sha(sha(salt+password)+password)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5425 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 08:48 PVG 16:48 LAX 01:48 JFK 04:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86