【问题标题】:Why is golang package bcrypt able to retrieve the salt after hashing the password?为什么golang包bcrypt能够在对密码进行哈希处理后检索盐?
【发布时间】:2020-11-11 06:10:54
【问题描述】:

我无法理解来自golang crypto bcrypt repo 的以下代码

func newFromHash(hashedSecret []byte) (*hashed, error) {
    if len(hashedSecret) < minHashSize {
        return nil, ErrHashTooShort
    }
    p := new(hashed)
    n, err := p.decodeVersion(hashedSecret)
    if err != nil {
        return nil, err
    }
    hashedSecret = hashedSecret[n:]
    n, err = p.decodeCost(hashedSecret)
    if err != nil {
        return nil, err
    }
    hashedSecret = hashedSecret[n:]

    // The "+2" is here because we'll have to append at most 2 '=' to the salt
    // when base64 decoding it in expensiveBlowfishSetup().
    p.salt = make([]byte, encodedSaltSize, encodedSaltSize+2)
    copy(p.salt, hashedSecret[:encodedSaltSize])

    hashedSecret = hashedSecret[encodedSaltSize:]
    p.hash = make([]byte, len(hashedSecret))
    copy(p.hash, hashedSecret)

    return p, nil
}

据我了解,加盐用于防止攻击者入侵数据库并获取哈希密码列表,从哈希中获取原始密码,黑客可以遍历所有有效密码组合并对每个密码组合进行哈希处理,如果生成的哈希之一与黑客数据库中的哈希匹配,则黑客可以取回密码。在哈希之前添加盐会迫使对手重新生成彩虹表。

关键是将密码与盐一起散列

hash(password + salt)

迫使黑客专门为盐重新生成彩虹表

但似乎bcrypt 能够取回盐,所以从技术上讲,如果攻击者知道系统正在使用bcrypt,他可以删除盐并获取未加盐的哈希密码。

换句话说,一旦黑客获得hashedSecret = hashedSecret[encodedSaltSize:],他就可以使用彩虹攻击来取回密码,从而使盐无用。

我是不是搞错了?

【问题讨论】:

    标签: go hash bcrypt rainbowtable


    【解决方案1】:

    他可以删除加盐,得到没有加盐的哈希密码。

    除了这部分之外的一切都是正确的。

    想象一下,你有一个密码 pass 和两个盐:s1s2

    • 哈希(s1 + pass) = 123

    • 哈希(s2 + pass) = 456

    因此,您的数据库中有两条存储记录:

    • 123 美元

    • s2$456

    删除 salt 部分不会让对手在任何地方得到攻击,因为他仍然需要破解两个不同的哈希摘要 123456

    另一方面,一旦您从用户那里获得明文,您将无法重建哈希。

    想象他们给你发pass。您想要做的是从存储在您的数据库中的哈希中获取盐子字符串,例如s2$456,然后将其与明文连接,然后将 hash(s2 + pass) 与上面的 456 进行比较。如果没有将盐存储在数据库中,则无法执行此操作,这就是必要的原因。

    【讨论】:

      【解决方案2】:

      你可以取回盐,但这并不意味着你得到了未加盐的密码哈希。 “换句话说,一旦黑客得到 hashedSecret = hashedSecret[encodedSaltSize:] 他就可以使用彩虹攻击来取回密码,使盐变得无用。”具有误导性。攻击者可以获得盐和哈希密码,但这不允许“彩虹攻击”。

      “彩虹攻击”中的攻击是:生成一个巨大的彩虹表一次预先。该列表是一对 (cleartextpassword,passwordhash) 条目。生成此表非常耗时(如果包含大量密码,可能会变得很大,如果包含所有密码,则可能会变得很大!)。 “彩虹攻击”中的攻击是:您必须只生成此彩虹表一次,并且可以使用它非常快速地查找数百万个密码哈希的明文密码。

      由于上面 bcrypt 代码中的每个密码都有自己的 salt,你不能使用 one 彩虹表:你必须创建一个彩虹每种盐的表。使“彩虹攻击”变得无用。

      【讨论】:

      • 更具体地说,生成涵盖一组密码的彩虹表比暴力破解同一组密码要多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 2021-06-08
      相关资源
      最近更新 更多