【问题标题】:Salt Before Hash or Hash Before Salt?先撒盐还是先撒盐?
【发布时间】:2016-04-20 18:45:51
【问题描述】:

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

  1. 散列前加盐

    hash(password + salt)
    
  2. 加盐前的哈希

    hash(hash(password) + salt)
    

我的直觉不知何故说,由于加盐前的哈希,第二种方法有问题,但这只是我的直觉,没有密码学基础。

其中一种方法是否比另一种更安全?第二种方法有什么弱点吗?

【问题讨论】:

  • 你的两个例子并不完全等价,hash(password) + salt 显然毫无意义!
  • 这就是HMAC 的用途,但它是安全的。但是现在你应该使用密码导向的方法,例如PBKDF2crypt;如果你关心安全。推导(散列)需要安全(MD5 不是)、加盐和缓慢(使尝试成本高昂。

标签: hash passwords salt


【解决方案1】:

推荐的哈希算法(如 PBKDF2 或 BCrypt)无法一次性计算哈希,因此所描述的方法都不够。他们应该提供一个成本因素,它控制计算单个哈希的必要时间。成本因素决定了完成多少轮哈希。

如何应用盐是算法的一部分,因此最好将其留给算法。

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

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

【讨论】:

    猜你喜欢
    • 2011-08-10
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    相关资源
    最近更新 更多