go - 为什么golang软件包bcrypt在哈希密码后能够检索盐?

标签 go hash bcrypt rainbowtable

我无法从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
}
根据我的理解,salting可以防止攻击者入侵数据库并获取哈希密码列表,从哈希中获取原始密码,黑客可以遍历所有有效的密码组合并对每个密码进行哈希处理(如果其中之一)生成的哈希与hack数据库中的哈希匹配,黑客可以取回密码。在哈希之前添加盐会迫使对手重新生成彩虹表。
关键是将密码和盐一起哈希
hash(password + salt)
迫使黑客重新生成专门用于盐的彩虹表
但是bcrypt似乎能够收回盐,因此从技术上讲,如果对手知道系统正在使用bcrypt,他可以删除盐并获取未加盐的哈希密码。
换句话说,一旦黑客获得了hashedSecret = hashedSecret[encodedSaltSize:],他就可以使用Rainbow攻击来找回密码,从而使盐无效。
我有什么问题吗?

最佳答案

he can delete the salt and get the hash password that is not salted.


除此部分以外的所有内容都是正确的。
想象一下,您有一个密码密码和两个盐:s1,s2。
  • hash(s1 + pass)= 123
  • hash(s2 + pass)= 456

  • 因此,您将在数据库中存储两条记录:
  • s1 $ 123
  • s2 $ 456

  • 删除盐部分不会使对手陷入困境,因为他仍然需要破解两个不同的哈希摘要123和456。
    另一方面,一旦您从用户那里获得明文,它将使您无法重建哈希。
    想象一下,他们向您发送通行证。您要做的是从存储在数据库中的哈希值中获取salt子字符串,例如 s2 $ 456,然后将其与明文连接,然后将hash(s2 + pass)与上面的456比较。没有将盐存储在数据库中,您将无法执行此操作,这就是为什么有必要这样做的原因。

    关于go - 为什么golang软件包bcrypt在哈希密码后能够检索盐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64781341/

    相关文章:

    http - 去测试导入错误

    jquery - 如何将选择选项值和文本存储在 JSON 对象或数组中?

    c# - 使用 C# 生成带 key 的 HMAC SHA256 的标准代码是什么

    c++ - 什么时候可以将结构安全地散列为字节数组?

    hash - 日志中的明文密码

    python - 如何检查存储在 PSQL DB 中的散列密码

    node.js - 尝试使用 npm i bcrypt 时未安装 bcrypt

    go - 在 go 编译器中使用 run 命令时,可执行文件会发生什么情况?

    reflection - 是否可以接收实现某个接口(interface)的所有结构?

    pointers - 如何检查嵌套指针访问/方法在运行时是否无效