V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cloudfstrife
V2EX  ›  信息安全

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

  •  
  •   cloudfstrife · 2019-12-17 15:38:21 +08:00 · 8496 次点击
    这是一个创建于 1804 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 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 不用手动存盐
    php01
        10
    php01  
       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   ·   实用小工具   ·   5716 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:47 · PVG 09:47 · LAX 17:47 · JFK 20:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.