83 lines
2.2 KiB
Go
83 lines
2.2 KiB
Go
/**
|
||
* 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
|
||
}
|
||
|