【发布时间】: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