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. 重要说明

  1. cost 参数:

    • 控制计算强度,值越大越安全但计算时间越长
    • 推荐值: 12-14 (现代硬件)
    • 每增加1,计算时间大约翻倍
  2. 安全特性:

    • 自动加盐(salt),无需手动处理
    • 包含哈希版本和cost值在结果中
    • 抗彩虹表攻击
  3. 错误处理:

    • 总是检查 HashPassword 的返回错误
    • 验证失败是正常情况,不应视为错误
  4. 存储:

    • 哈希结果可以直接存储为字符串
    • 典型长度约60字符

4. 最佳实践

  1. 在生产环境中使用 cost >= 12
  2. 不要自己实现密码哈希算法
  3. 使用 HTTPS 传输密码
  4. 考虑添加额外的安全层(如pepper)

5. 性能考虑

bcrypt 设计为故意缓慢以抵抗暴力破解,在用户注册/登录时:

  • 可以接受几百毫秒的计算时间
  • 对于高流量系统,可能需要调整cost值
  • 考虑使用异步处理避免阻塞
每日更新-免费小火箭账号
不要错过任何机会,探索最新的应用和游戏,就在我们的平台。
立即访问
最后修改:2025 年 04 月 11 日
如果觉得我的文章对你有用,请随意赞赏