我无法从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。
因此,您将在数据库中存储两条记录:
删除盐部分不会使对手陷入困境,因为他仍然需要破解两个不同的哈希摘要123和456。
另一方面,一旦您从用户那里获得明文,它将使您无法重建哈希。
想象一下,他们向您发送通行证。您要做的是从存储在数据库中的哈希值中获取salt子字符串,例如 s2 $ 456,然后将其与明文连接,然后将hash(s2 + pass)与上面的456比较。没有将盐存储在数据库中,您将无法执行此操作,这就是为什么有必要这样做的原因。
关于go - 为什么golang软件包bcrypt在哈希密码后能够检索盐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64781341/