我无法理解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:]
,他可以使用彩虹攻击来取回密码,使盐无用。
我有什么问题吗?