Bcrypt 在 go 中需要很多时间?
Bcrypt takes a lot of time in go?
我在 GO gin 中使用了 bcrypt
包,奇怪的是当我加密任何密码时它需要 500 毫秒到 900 毫秒作为响应
代码:
package main
import (
"github.com/gin-gonic/gin"
"golang.org/x/crypto/bcrypt"
)
type User struct {
ID uint
Name string
Email string
Password []byte
}
func (user *User) HashPassword(password []byte) {
hashedPassword, _ := bcrypt.GenerateFromPassword(password, 12)
user.Password = hashedPassword
}
func main() {
r := gin.Default()
r.GET("/user", func(c *gin.Context) {
user := User{
Name: "test",
Email: "test@gmail.com",
Password: []byte("password"),
}
user.HashPassword(user.Password)
c.JSON(200, gin.H{
"message": "done",
})
})
r.Run(":5050")
}
我从 Postman 进行基准测试 status: 200 OK Time: 800ms
为什么这个 pkg 需要这个时间!?
bcrypt
的 objective 是执行计算时间长的散列,因此很难用蛮力破解。这种低性能实际上是一个特性。
这就是 key derivation function such as BCrypt 的全部目的是为了使暴力破解变得不切实际而需要大量的计算。
但是12的成本系数太高了。您应该将其减少到 10 或 8。
bcrypt.GenerateFromPassword(password, 10) // 10 is the default cost
这是一个具有不同 BCrypt 成本因素的演示计时测试:
func test(cost int) {
t1 := time.Now()
_, _ = bcrypt.GenerateFromPassword([]byte("test pass"), cost)
t2 := time.Now()
fmt.Println(cost, ": ", t2.Sub(t1))
}
func main() {
for i := 4; i < 15; i++ {
test(i)
}
}
输出:
4 : 2.2077ms
5 : 3.404ms
6 : 6.8319ms
7 : 14.732ms
8 : 23.4149ms
9 : 46.2739ms
10 : 98.964ms
11 : 187.7988ms
12 : 371.6627ms
13 : 754.1349ms
14 : 1.5391565s
我在 GO gin 中使用了 bcrypt
包,奇怪的是当我加密任何密码时它需要 500 毫秒到 900 毫秒作为响应
代码:
package main
import (
"github.com/gin-gonic/gin"
"golang.org/x/crypto/bcrypt"
)
type User struct {
ID uint
Name string
Email string
Password []byte
}
func (user *User) HashPassword(password []byte) {
hashedPassword, _ := bcrypt.GenerateFromPassword(password, 12)
user.Password = hashedPassword
}
func main() {
r := gin.Default()
r.GET("/user", func(c *gin.Context) {
user := User{
Name: "test",
Email: "test@gmail.com",
Password: []byte("password"),
}
user.HashPassword(user.Password)
c.JSON(200, gin.H{
"message": "done",
})
})
r.Run(":5050")
}
我从 Postman 进行基准测试 status: 200 OK Time: 800ms
为什么这个 pkg 需要这个时间!?
bcrypt
的 objective 是执行计算时间长的散列,因此很难用蛮力破解。这种低性能实际上是一个特性。
这就是 key derivation function such as BCrypt 的全部目的是为了使暴力破解变得不切实际而需要大量的计算。
但是12的成本系数太高了。您应该将其减少到 10 或 8。
bcrypt.GenerateFromPassword(password, 10) // 10 is the default cost
这是一个具有不同 BCrypt 成本因素的演示计时测试:
func test(cost int) {
t1 := time.Now()
_, _ = bcrypt.GenerateFromPassword([]byte("test pass"), cost)
t2 := time.Now()
fmt.Println(cost, ": ", t2.Sub(t1))
}
func main() {
for i := 4; i < 15; i++ {
test(i)
}
}
输出:
4 : 2.2077ms
5 : 3.404ms
6 : 6.8319ms
7 : 14.732ms
8 : 23.4149ms
9 : 46.2739ms
10 : 98.964ms
11 : 187.7988ms
12 : 371.6627ms
13 : 754.1349ms
14 : 1.5391565s