use*_*010 2 hash go bcrypt rainbowtable
我无法理解golang crypto bcrypt 存储库中的以下代码
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
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,salting 用于防止攻击者入侵数据库并获取哈希密码列表,从哈希中获取原始密码,黑客可以遍历所有有效的密码组合并对每个密码组合进行哈希处理,如果其中之一生成的哈希与黑客数据库中的哈希匹配,黑客可以取回密码。在散列之前添加盐迫使对手重新生成彩虹表。
关键是将密码与盐一起散列
hash(password + salt)
Run Code Online (Sandbox Code Playgroud)
强迫黑客专门为盐重新生成彩虹表
但似乎bcrypt能够取回盐,因此从技术上讲,如果对手知道系统正在使用bcrypt,他可以删除盐并获得未加盐的哈希密码。
换句话说,一旦黑客得到了hashedSecret = hashedSecret[encodedSaltSize:]他就可以使用彩虹攻击来取回密码,从而使盐无用。
我有什么问题吗?
他可以删除salt,得到未加盐的hash密码。
除了这部分,其他都是对的。
想象一下,您有一个密码通行证和两个盐:s1、s2。
哈希(s1 + 通过)= 123
哈希(s2 + 通过)= 456
因此,您的数据库中将有两条存储记录:
s1$123
s2$456
删除 salt 部分不会让对手在任何地方得到攻击,因为他仍然有两个不同的哈希摘要123和456需要破解。
另一方面,一旦你从你的用户那里得到明文,它会让你自己无法重建你的散列。
想象一下他们给你发送通行证。您想要做的是从存储在您的数据库中的散列中获取盐子字符串,例如s2 $456,然后将其与明文连接,然后将 hash(s2 + pass) 与上面的 456 进行比较。如果没有将您的盐存储在数据库中,您就无法做到这一点,这就是为什么它是必要的。