Go语言 为什么bcrypt库CompareHashAndPassword方法很慢?

dauxcl2d  于 2023-06-19  发布在  Go
关注(0)|答案(2)|浏览(184)

我想比较密码并使用bcrypt库,但CompareHashAndPassword方法非常慢。为什么这个方法很慢?

var b  []byte =  []byte("1234")
 var bx  []byte =  []byte("$2a$14$RWV9NhWmlQmSoV9toM/k9OIzaNcYssCiauPVAljiX2NGhqvyxcOMy")
 fmt.Println("Start Compare: ", time.Now().Format("2006-01-02 15:04:05.000000"))
 err := bcrypt.CompareHashAndPassword(bx, b)
 fmt.Println("Completed Compare: ", time.Now().Format("2006-01-02 15:04:05.000000"))
 fmt.Println("------------------------")

结果:
开始比较:2018 - 03 - 22 22:53:09.142380
完成的比较:2018 - 03 - 22 22:53:10.347585
你能帮我吗?

zzoitvuj

zzoitvuj1#

慢是bcrypt的一个设计特性,因为如果它很快,就很容易暴力破解密码哈希。Wikipedia
除了加入一个salt来防止rainbow table攻击之外,bcrypt还是一个自适应函数:随着时间的推移,迭代次数可以增加以使其更慢,因此即使在计算能力增加的情况下,它仍然可以抵抗蛮力搜索攻击。

2izufjch

2izufjch2#

在开发和测试时,我降低了bcrypt的成本,使它运行得更快
例如:

hashPassword, _ := bcrypt.GenerateFromPassword([]byte(password), 4)
"$2a$04$gZUB3tTcsht5JehP3jVxCeOVZSOGzy5ztfXh1kSbp3EDzEXCCH5v."

与我通常的成本值14相比,那条线运行得非常快
所以,当你比较的时候,bcrypt会读取你的哈希值并进行计算。
在您的示例中,我看到您使用cost14来生成该散列

[]byte("$2a$14$RWV9NhWmlQmSoV9toM/k9OIzaNcYssCiauPVAljiX2NGhqvyxcOMy")

也许降低成本对你来说也会起作用。

相关问题