【问题标题】:Bcrypt takes a lot of time in go?Bcrypt 需要很多时间吗?
【发布时间】:2021-12-02 15:57:37
【问题描述】:

我在 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 需要这么长时间!?

【问题讨论】:

  • md5 much 快,所以如果速度是您唯一需要解决的问题,请使用它(但如果您使用 md5,请不要怪我!我从不推荐使用md5!)。有时您必须了解自己真正想要什么。
  • @Volker 我达到了bcrypt 10 的级别,现在速度非常好,谢谢

标签: go go-gin


【解决方案1】:

bcrypt 的目标是执行计算时间较长的哈希,因此很难被蛮力破解。这种低性能实际上是一个特性。

【讨论】:

    【解决方案2】:

    这就是 key derivation function(例如 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
    

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 2011-10-02
      • 2021-01-11
      相关资源
      最近更新 更多