/** * package utils * * 密码加密和验证工具包 * * 功能概述: * 1. 使用bcrypt算法加密密码(单向哈希,不可逆) * 2. 验证明文密码与加密密码是否匹配 * * 安全特性: * - 使用bcrypt算法,自动加盐 * - 计算成本可调,防止暴力破解 * - 相同密码每次加密结果不同(因为盐值随机) */ package utils import "golang.org/x/crypto/bcrypt" /** * HashPassword * * 功能:使用bcrypt算法加密密码 * * 步骤: * 1. 将明文密码转换为字节数组 * 2. 使用bcrypt算法生成哈希值(自动加盐) * 3. 将哈希值转换为字符串返回 * * 特点: * - 每次加密结果不同(因为盐值随机) * - 使用默认计算成本(10轮) * - 单向加密,不可逆 * * 使用场景: * - 用户注册时加密密码 * - 用户修改密码时加密新密码 * * @param password 明文密码 * @returns 加密后的密码哈希字符串和错误 */ func HashPassword(password string) (string, error) { // 步骤1-2: 使用bcrypt算法生成密码哈希 // bcrypt.DefaultCost = 10,表示进行2^10=1024轮哈希计算 bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) if err != nil { return "", err } // 步骤3: 将哈希值转换为字符串返回 return string(bytes), nil } /** * CheckPassword * * 功能:验证明文密码与加密密码是否匹配 * * 步骤: * 1. 从加密密码中提取盐值 * 2. 使用相同的盐值对明文密码进行哈希 * 3. 比较两个哈希值是否相同 * * 特点: * - 即使密码相同,每次加密的哈希值也不同 * - 但可以通过CompareHashAndPassword正确验证 * - 验证过程是安全的,不会泄露密码信息 * * 使用场景: * - 用户登录时验证密码 * - 修改密码时验证旧密码 * * @param password 明文密码 * @param hash 加密后的密码哈希 * @returns 是否匹配(true=匹配,false=不匹配) */ func CheckPassword(password, hash string) bool { // 步骤1-3: 比较明文密码的哈希值与存储的哈希值 // 如果匹配,err为nil,返回true;否则返回false err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) return err == nil }