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

大家一般怎么生成盐的啊。。

  •  
  •   flowfire · 2017-12-28 02:02:28 +08:00 · 15594 次点击
    这是一个创建于 2526 天前的主题,其中的信息可能已经有所发展或是发生改变。

    nodejs 里用 crypto.randomBytes 生成一个 32 字节的随机数够不够。。
    以及密码 hash 就直接用 hamc(password, salt) 么 = = 啥算法比较好.。。sha256 够么= =

    65 条回复    2018-01-02 15:55:09 +08:00
    thetast
        1
    thetast  
       2017-12-28 02:20:53 +08:00 via Android   ❤️ 12
    楼下超市买😁
    kmdgeek
        2
    kmdgeek  
       2017-12-28 02:54:19 +08:00
    重结晶?(捂脸逃
    bao3
        3
    bao3  
       2017-12-28 02:55:36 +08:00 via iPhone   ❤️ 7
    跑步后不要洗澡,大约 5 分钟得到盐
    moult
        4
    moult  
       2017-12-28 03:34:38 +08:00 via iPhone
    盐么,没必要想那么复杂,随机来个 32 位的字符串差不多了。
    密码加密么,Symfony 做法是将密码和盐拼凑一起进行 SHA,然后将 SHA 的结果和密码和盐拼凑一起进行 SHA,就这样来个 5000 次。。。
    dangyuluo
        5
    dangyuluo  
       2017-12-28 04:25:28 +08:00
    salt 有必要这么长么?看了一些系统的代码,4 位 8 位居多
    yangqi
        6
    yangqi  
       2017-12-28 05:05:27 +08:00
    加盐并不能提高安全性
    cnnblike
        7
    cnnblike  
       2017-12-28 06:26:31 +08:00
    可以去 random.org 上生成的——但问题不在盐上,盐只是整个系统的一环,被攻破的时候最后出问题的往往不是盐而是一些愚蠢的设计。
    flowfire
        8
    flowfire  
    OP
       2017-12-28 07:52:49 +08:00 via Android
    @yangqi ..... 为啥…………就算提高不了好歹也能防彩虹表吧

    @cnnblike 给用户生成盐还要调接口是不是太慢了一点
    Torpedo
        9
    Torpedo  
       2017-12-28 07:59:22 +08:00 via Android
    bcrypt 啊
    mozutaba
        10
    mozutaba  
       2017-12-28 08:35:21 +08:00 via Android   ❤️ 2
    尿完不冲,自动结晶
    phx13ye
        11
    phx13ye  
       2017-12-28 08:38:17 +08:00
    建议 argon2,
    argon2.generateSalt().then(salt => {
    argon2.hash('some-user-password', salt).then(hash => {
    console.log('Successfully created Argon2 hash:', hash);
    // TODO: store the hash in the user database
    });
    });
    justfindu
        12
    justfindu  
       2017-12-28 08:41:05 +08:00
    6-12 位 random 生成字母数字标点. 然而现在一般用 bcrypt
    xomix
        13
    xomix  
       2017-12-28 09:02:44 +08:00
    首先肯定要加个时间戳,然后你可以密码加用户名然后 md5 做盐,你还可以密码 md5 前 16 位加用户名 md5 后 16 位假装自己是 32 位 md5,加盐后验证奇数或偶数位的 md5 假装自己是动态 md516 位加密。(客户端随机传奇偶位,服务器端两种验证都做,有一种通过即可)
    让想逆推的人慢慢猜。
    yilai
        14
    yilai  
       2017-12-28 09:13:15 +08:00
    参考 django
    dilu
        15
    dilu  
       2017-12-28 09:16:24 +08:00
    加盐不如 bcrypt 虽然速度下来了 但是安全性能上去了
    me1ody
        16
    me1ody  
       2017-12-28 09:18:10 +08:00
    如果密码简单在复杂的 salt 也是一样的,所以 salt 4-6 位即可
    Cat73
        17
    Cat73  
       2017-12-28 09:19:30 +08:00
    @moult 我们项目还真差不多就这样的,用户的 ID 加随机 8 个字符当盐,盐+密码来一次 hash,然后 hash+密码继续 hash 上 pow(2, 8 + 3) 次,最后的密码是 3(hash 次数) + 盐(不含用户 ID 的部分) + hash
    mcfog
        18
    mcfog  
       2017-12-28 09:22:00 +08:00 via Android
    配置的 secret/固定盐的话 openssl 命令生产,密码的话,不用自己手动生成盐,用类似 http://php.net/password_hash 的专用类库做这件事情,一个字段包含算法、盐、哈希,而且很容易支持 rehash,指定 cost 之类的
    clino
        19
    clino  
       2017-12-28 09:25:56 +08:00
    whx20202
        20
    whx20202  
       2017-12-28 09:29:26 +08:00   ❤️ 1
    来来来看这个 http://blog.jobbole.com/61872/
    如果不懂建议无脑 bcrypt
    shuizhengqi
        21
    shuizhengqi  
       2017-12-28 09:43:39 +08:00
    我都是去超市买
    ksupertu
        22
    ksupertu  
       2017-12-28 10:01:47 +08:00 via iPhone
    bcrypt 啊,知乎都用的这个加 python:doge
    icaca
        23
    icaca  
       2017-12-28 10:04:08 +08:00
    🐶东搜竹盐
    shihty5
        24
    shihty5  
       2017-12-28 10:08:45 +08:00
    抖机灵的都好无聊,第一个还算有点创意,后面的- -
    sea516
        25
    sea516  
       2017-12-28 10:09:51 +08:00
    去盐城
    Reign
        26
    Reign  
       2017-12-28 10:55:15 +08:00
    random
    realpg
        27
    realpg  
       2017-12-28 11:17:53 +08:00 via Android
    火碱兑醋精
    f2f2f
        28
    f2f2f  
       2017-12-28 11:24:02 +08:00
    $md5($md5($random+$timestamp)+$random)
    别告诉我你觉得这还不够
    qnxu
        29
    qnxu  
       2017-12-28 11:25:42 +08:00
    @bao3 谁都不服就服你
    Doodlister
        30
    Doodlister  
       2017-12-28 12:17:10 +08:00 via Android
    shiro。
    geelaw
        31
    geelaw  
       2017-12-28 12:45:32 +08:00
    看了上面一些回复,很有“保存 100 遍确保保存成功”的代码的感觉。
    zythum
        32
    zythum  
       2017-12-28 13:05:27 +08:00
    一般用 pm 的名字当盐
    hcnhcn012
        33
    hcnhcn012  
       2017-12-28 13:56:40 +08:00 via iPhone
    2Na + Cl2 === 2NaCl
    Livid
        34
    Livid  
    MOD
       2017-12-28 14:37:51 +08:00
    上面发布无意义跑题回复的账号已经全部被 Deactivate。
    raofeng
        35
    raofeng  
       2017-12-28 14:55:37 +08:00
    我们也用的 bcrypt
    we000
        36
    we000  
       2017-12-28 15:31:29 +08:00   ❤️ 5
    @Livid 这样的操作应该越少越好, 威权用得越多大家越反感. 我个人对你管理社区的不满全来自于此, 当然你的地盘你说了算, 我也还是喜欢换小号过来晃.

    这个帖子我觉得一部分原因是因为标题, 如果标题写好"算哈希的时候怎么生成盐", 估计没人会抖机灵.
    suspended
        37
    suspended  
       2017-12-28 15:35:04 +08:00
    某些人以为多次 hash 能增强安全性,笑死人了。
    flowfire
        38
    flowfire  
    OP
       2017-12-28 15:36:10 +08:00
    @suspended #37 我以前也是这么以为的 [捂脸
    yorath
        39
    yorath  
       2017-12-28 16:16:04 +08:00
    看标题以为大家用的盐都是自己生成的 不是超市买来的....
    SingeeKing
        40
    SingeeKing  
       2017-12-28 17:27:23 +08:00
    @suspended 哎难道不是吗。。
    ThatIsFine
        41
    ThatIsFine  
       2017-12-28 18:00:15 +08:00
    @SingeeKing 就是一定长度的字符串而已, 它自己再怎么算也没多大作用.

    创建一般是输入一个口令, 经过加密算法, 再搞一个随机串(盐)合并, 最后再加密, 盐和最后的串存数据库, 每次鉴权会再使用盐和输入算最后的串.
    通过彩虹表撞库, 一般是已知算法, 生成数据字典, 去直接撞最后的串.
    ligo
        42
    ligo  
       2017-12-28 18:06:48 +08:00 via Android
    酸碱中和
    ligo
        43
    ligo  
       2017-12-28 18:12:36 +08:00 via Android
    怎样删除回复??盐只要无法预测就可以了
    ligo
        44
    ligo  
       2017-12-28 18:26:46 +08:00 via Android
    我又想了一下,盐可以预测也无所谓,只要每个用户的盐值不同就行
    geelaw
        45
    geelaw  
       2017-12-28 18:32:44 +08:00 via iPhone
    @SingeeKing
    @ThatIsFine
    @flowfire
    @suspended

    多次 hash 唯一可能增加安全性的可能是让 hash 计算变慢,然而这个和盐没什么关系。而且区区那么几次也没太大作用,我也不太懂为什么他们要,比如,hash 5000 次之类的。
    suspended
        46
    suspended  
       2017-12-28 18:45:25 +08:00
    @geelaw 并没有。实际上是增加了自己系统的计算量,减少了攻击者的计算量,降低了系统安全性的。
    geelaw
        47
    geelaw  
       2017-12-28 18:49:47 +08:00 via iPhone
    @suspended 没明白,攻击者拖库之后想要算出一个可以通过系统验证的密码是需要自己算了 hash 的。没有明白这怎么减少了攻击者的计算量。

    注意语境:加盐是为了防止拖库之后攻击者能用彩虹表或者频率统计的方法获取密码,这里的手法都是为了阻碍拖库之后得到密码的。
    l1093178
        48
    l1093178  
       2017-12-28 18:51:18 +08:00
    每个用户盐不一样,而且盐足够长就行了,对随机性没什么要求...
    以及记得选个慢 hash 函数(比如 argon2,scrypt 或者 bcrypt,安全性依序降低),md5 和 SHA 系列 hash 函数都不安全(用 GPU / 专用硬件破解起来很快)

    @suspended 然而多次 hash 确实能提高破解的成本,当然新的密码 hash 函数都直接把 cost 设置为 hash 函数的一个参数了。
    chinvo
        49
    chinvo  
       2017-12-28 19:02:44 +08:00
    @geelaw 随机输入计算一次,输入是不定长的,但是多次计算,相当于拿最后那个定长字符串去算一次。
    msg7086
        50
    msg7086  
       2017-12-28 19:23:01 +08:00
    @geelaw 前提是源码不泄露?

    @flowfire 生成随机数直接用语言运行时自带的就好了。
    Java 和 Ruby 用 SecureRandom,PHP 可以用 random_bytes 这些。
    geelaw
        51
    geelaw  
       2017-12-28 19:51:44 +08:00
    @chinvo #49 并不是这样的,攻击者的目标是找到一个字符串作为密码输入系统的时候可以通过验证,譬如系统要求

    hash1(hash2(input)) == saved_hash

    并不是说找到了 found=hash2(password) 就可以的——目标是解方程 hash1(hash2(x)) = y,而 x=found 并不是一个解。注意:这两个 hash 都是在服务器算的,在客户端算的已经被建模为 input 了。

    @msg7086 #50 不知道您回复的是哪一层,不过无论如何,安全的系统不怕代码泄露。
    msg7086
        52
    msg7086  
       2017-12-28 19:57:40 +08:00
    @geelaw 我重新读了 3 遍回复,感觉你,我,和 @suspended 互相有些上下文上的误解……

    suspended 同意了你的观点,你反对了他的观点,我同意了 suspended 的观点,然后反对了你的观点,又同意了你之前的观点。
    suspended
        53
    suspended  
       2017-12-28 20:04:38 +08:00
    @geelaw 恩,我的说法不对,没有考虑位数带来的计算量指数级增长,只考虑了 hash 结果的字符集是可预测的范围。
    geelaw
        54
    geelaw  
       2017-12-28 20:09:01 +08:00
    @msg7086 #52

    我 #31:不需要多次 hash
    suspended #37:多次 hash 不能增强安全性(同意我)
    我 #45:(回复 #37 )多次 hash **有时**可以通过增加计算 hash 的难度增加安全性,但是这种方法和“盐”的主题没关系
    suspended #46:(我认为是回复 #45 )多次 hash 会降低安全性
    我 #47:(回复 #46 )没明白 #46
    您 #50:(不知道回复哪一层)

    我在 #31 表示不需要多次 hash 是说就盐这个机制,而且使用专门设计的慢 hash 更好;此外,我觉得是“保存 100 次”的另一个原因是,我没看出来他们这样做是为了减慢速度,那些发言给我的感觉是单纯觉得多加几次 hash 更难。

    完整来说,我的观点:

    - 增加(固定次数的) hash 次数等价于改变 hash 函数,并不会让破解更困难(除了可能会让 hash 计算更慢这方面)
    - 加盐是为了让每个用户用不同的 hash 函数,从而无效化彩虹表和频率统计
    msg7086
        55
    msg7086  
       2017-12-28 20:12:55 +08:00
    @geelaw 你的观点没错。
    我是想说多次 hash 只要源码和数据库一起泄露就无效了,不能提高安全性。
    你 47 没明白 46,所以我 50 也一眼没看明白 47。
    geelaw
        56
    geelaw  
       2017-12-28 20:16:44 +08:00
    @msg7086 但我还是没理解怎么会“降低安全性”。
    msg7086
        57
    msg7086  
       2017-12-28 20:27:41 +08:00
    @geelaw

    suspended 1 小时 40 分钟前
    并没有。 [将专业的加盐 Hash 替换为多次反复计算 Hash,]实际上是增加了自己系统的计算量,减少了攻击者的计算量,降低了系统安全性的。
    sgissb1
        58
    sgissb1  
       2017-12-28 20:27:57 +08:00
    超市或者小卖铺买一包,接着倒出来,就生成盐了。这是最安全的。

    科学宅的做法,一般是买一瓶氢氧化钠,接着买点盐酸,按照一摩尔氢氧化钠和一摩尔盐酸的比例用滴注法一点点的混合,在混合过程中需要用烧瓶作为容器,且需要注意温度变化,带滴注完成后,用玻璃棒轻微的搅拌调匀,即可得到
    生成 的氯化钠,也就是我们百姓口中说的不加典食盐的主要成分。
    geelaw
        59
    geelaw  
       2017-12-28 20:29:52 +08:00
    @msg7086 get 这个意思了,但是前面反复 hash 很多次的人也都加了盐,所以没想到这个省略的意思。
    kmahyyg
        60
    kmahyyg  
       2017-12-28 21:03:44 +08:00 via Android
    python3.6

    secrets.token_urlsafe(16)
    youyoulemon
        61
    youyoulemon  
       2017-12-28 21:17:55 +08:00
    @sgissb1 呆子才会用昂贵的氢氧化钠、盐酸反应#滑稽
    ligo
        62
    ligo  
       2017-12-28 21:23:22 +08:00 via Android
    @l1093178 我的理解对不对
    1.加盐的本质是增加密码的有效长度
    2.不同的盐之间尽量不要有公共子序列
    3.hash 破解难度随长度指数增长
    sgissb1
        63
    sgissb1  
       2017-12-29 10:06:31 +08:00
    @youyoulemon 我觉得氢氧化钠不贵啊,莫非我记错了?
    sgissb1
        64
    sgissb1  
       2017-12-29 10:06:54 +08:00
    @youyoulemon 打错字了,我不是觉得,我是记得!
    alexlee0728
        65
    alexlee0728  
       2018-01-02 15:55:09 +08:00
    @Livid 如何合并账号或注销某个账号? https://www.v2ex.com/t/418578
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4010 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 04:13 · PVG 12:13 · LAX 20:13 · JFK 23:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.