我正在开发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
会更好吗?
您的最高费用为32。这意味着2 ^ 32轮密钥扩展。即使是一个简单的循环,只要遍历1到2 ^ 32之间的每个数字而没有执行任何操作,也将花费几秒钟。您需要将费用上限限制在一个更合理的数字。
此外,成本4太小。只有16轮。这将使破解密码的方式比应该的容易。
您为什么还要使用随机数? Read this,用于选择费用的更好方法。