Go 自带的bcrypt
库可以进行密码加密与校验
生成密码:
import "golang.org/x/crypto/bcrypt"
// 定义密码强度
const cost int = 10
// 变量`cost`用于定义密码强度,值越大,则密码检验强度越高。
// 生成密码
func GeneratePassword(password string) (string, error) {
// 加密密码
hashed, err := bcrypt.GenerateFromPassword([]byte(password), cost)
if err != nil {
return "", err
}
return string(hashed), nil
}
校验密码:
import "golang.org/x/crypto/bcrypt"
// 校验密码
func CheckPassword(password string, hashedPassword string) bool {
// 比较密码
err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password))
return err == nil
}
在使用bcrypt
算法进行密码加密时,cost
参数用于指定计算强度,代表着加密的次数。bcrypt
算法的工作原理是将明文密码和随机生成的salt
混合后,使用 blowfish
密码算法进行多次加密。密码校验的过程是将用户输入的明文密码和从数据库中取出的密文(哈希值)中提取出的salt
一起参与运算生成新的哈希值,再将新的哈希值与数据库中的哈希值进行比较。如果两者相同,则表明密码校验成功。
cost
值的取值范围为4~31
,通常取10~14
,更高的计算强度会提高密码的安全等级,但同时也会带来更高的 CPU 资源消耗,因此需要根据实际应用场景选择合适的计算强度。