GO-为什么哈希这么慢?

问题描述 投票:0回答:1

我正在开发Web应用程序。为了哈希密码,我使用了以下逻辑

package core

import (
    "math/rand"

    "golang.org/x/crypto/bcrypt"
)

type User struct {
    Username string `json:"username"`
    Password string `json:"password"`
}

type Hasher interface {
    HashPassword()
}

func (u *User) HashPassword() {
    cost := rand.Intn(28) + 4

    //TODO: Handle error
    hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(u.Password), cost)
    u.Password = string(hashedPassword)
}

然后在处理请求时

func HandleRegister(w http.ResponseWriter, r *http.Request) {
    var user core.User
    var hasher core.Hasher
    hasher = &user

    //TODO: Handle error
    _ = json.NewDecoder(r.Body).Decode(&user)

    hasher.HashPassword()

    fmt.Println(user)
}

出于安全原因,我将随机费用用于哈希计算。问题是,当成本变大时,过程确实很慢。我正在使用Postman将请求发送到我的服务器,但速度确实很慢。为什么呢?我的实现错误吗?

注意:在我的SQLite数据库中,我为密码列选择TEXT类型以存储哈希密码。使用BLOB类型而不是TEXT会更好吗?

go hash
1个回答
1
投票

您的最高费用为32。这意味着2 ^ 32轮密钥扩展。即使是一个简单的循环,只要遍历1到2 ^ 32之间的每个数字而没有执行任何操作,也将花费几秒钟。您需要将费用上限限制在一个更合理的数字。

此外,成本4太小。只有16轮。这将使破解密码的方式比应该的容易。

您为什么还要使用随机数? Read this,用于选择费用的更好方法。

© www.soinside.com 2019 - 2024. All rights reserved.