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