Hash 先咸后咸还是先咸后咸?

Hash 先咸后咸还是先咸后咸?,hash,passwords,salt,Hash,Passwords,Salt,很明显,在写入数据库之前,我们应该对密码进行加密和散列。为此,我看到了两种不同的基本方法: 先腌后炒 hash(password + salt) 腌制前先炒 hash(hash(password) + salt) 我的直觉告诉我,第二种方法由于盐析前的散列而有问题,但这只是我的直觉,没有密码学基础 这些方法中有一种比另一种更安全吗?第二种方法有缺点吗?推荐的哈希算法(如PBKDF2或BCrypt)无法在一次传递中计算哈希,因此所述两种方法都不够。它们应该提供一个成本因子,用于控制计算单个

很明显,在写入数据库之前,我们应该对密码进行加密和散列。为此,我看到了两种不同的基本方法:

  • 先腌后炒

    hash(password + salt)
    
  • 腌制前先炒

    hash(hash(password) + salt)
    
  • 我的直觉告诉我,第二种方法由于盐析前的散列而有问题,但这只是我的直觉,没有密码学基础


    这些方法中有一种比另一种更安全吗?第二种方法有缺点吗?

    推荐的哈希算法(如PBKDF2或BCrypt)无法在一次传递中计算哈希,因此所述两种方法都不够。它们应该提供一个成本因子,用于控制计算单个散列所需的时间。成本因素决定了进行了多少轮哈希运算

    如何应用salt是算法的一部分,因此最好由算法决定

    这就是BCrypt应用salt的方式(来自维基百科):


    您的两个示例并不完全相同,
    hash(password)+salt
    显然毫无意义!这就是我们的目的,但它确实安全。但是现在你应该使用密码导向的方法,比如
    PBKDF2
    crypt
    ;如果你关心安全。派生(散列)需要是安全的(MD5不是)、有盐的和缓慢的(以使尝试代价高昂)。
    EksBlowfishSetup(cost, salt, key)
        state \gets InitState()
        state \gets ExpandKey(state, salt, key)
        repeat (2cost)
            state \gets ExpandKey(state, 0, key)
            state \gets ExpandKey(state, 0, salt)
        return state