bcrypt 使用笔记
bcrypt 是一个用于密码哈希的安全算法,以下是 Go 语言中使用 bcrypt 的完整示例和说明:
1. 基本用法
package main
import (
"golang.org/x/crypto/bcrypt"
)
func main() {
// 示例密码
password := "mySecurePassword123"
// 生成哈希密码
hashedPassword, err := HashPassword(password)
if err != nil {
panic(err)
}
println("Hashed password:", hashedPassword)
// 验证密码
if VerifyPassword(password, hashedPassword) {
println("密码验证成功")
} else {
println("密码验证失败")
}
}
2. 核心函数
密码哈希函数
// HashPassword 生成密码的 bcrypt 哈希
// cost 参数控制计算强度(建议 >= 12)
func HashPassword(password string) (string, error) {
cost := 12 // 计算成本,值越大越安全但越耗时
hashedBytes, err := bcrypt.GenerateFromPassword([]byte(password), cost)
if err != nil {
return "", err
}
return string(hashedBytes), nil
}
密码验证函数
// VerifyPassword 验证输入密码是否匹配存储的哈希
func VerifyPassword(inputPassword, storedHash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(storedHash), []byte(inputPassword))
return err == nil // true 表示验证通过
}
3. 重要说明
cost 参数:
- 控制计算强度,值越大越安全但计算时间越长
- 推荐值: 12-14 (现代硬件)
- 每增加1,计算时间大约翻倍
安全特性:
- 自动加盐(salt),无需手动处理
- 包含哈希版本和cost值在结果中
- 抗彩虹表攻击
错误处理:
- 总是检查 HashPassword 的返回错误
- 验证失败是正常情况,不应视为错误
存储:
- 哈希结果可以直接存储为字符串
- 典型长度约60字符
4. 最佳实践
- 在生产环境中使用 cost >= 12
- 不要自己实现密码哈希算法
- 使用 HTTPS 传输密码
- 考虑添加额外的安全层(如pepper)
5. 性能考虑
bcrypt 设计为故意缓慢以抵抗暴力破解,在用户注册/登录时:
- 可以接受几百毫秒的计算时间
- 对于高流量系统,可能需要调整cost值
- 考虑使用异步处理避免阻塞