完成全部后端和管理系统

This commit is contained in:
2025-11-03 17:23:03 +08:00
parent dfd1438981
commit 83b200c841
29 changed files with 1722 additions and 522 deletions

View File

@@ -0,0 +1,69 @@
package main
import (
"log"
"golang.org/x/crypto/bcrypt"
)
// EncryptPassword 对明文密码进行 bcrypt 加密
// 输入明文密码string
// 返回加密后的哈希字符串string和可能的错误error
func EncryptPassword(plainPassword string) (string, error) {
passwordBytes := []byte(plainPassword)
// cost=12生产环境推荐值
hashBytes, err := bcrypt.GenerateFromPassword(passwordBytes, 12)
if err != nil {
return "", err
}
return string(hashBytes), nil
}
// VerifyPassword 验证明文密码与哈希密码是否匹配(核心:替代“解密”)
// 输入:明文密码(用户登录时输入)、数据库存储的哈希密码
// 返回是否匹配bool、错误error
func VerifyPassword(plainPassword, hashedPassword string) (bool, error) {
// 1. 转换为字节切片
plainBytes := []byte(plainPassword)
hashedBytes := []byte(hashedPassword)
// 2. 核心验证bcrypt 自动提取哈希中的盐值,用同样算法加密明文后比对
// 注意:这里返回的 error 是“验证失败”或“算法异常”,不是解密错误
err := bcrypt.CompareHashAndPassword(hashedBytes, plainBytes)
if err == nil {
return true, nil // 匹配成功(密码正确)
} else if err == bcrypt.ErrMismatchedHashAndPassword {
return false, nil // 匹配失败(密码错误)
} else {
return false, err // 其他异常(如哈希格式错误、内存不足等)
}
}
// 示例使用
func main() {
// 明文密码
plainPwd := "admin"
// 加密
hashedPwd, err := EncryptPassword(plainPwd)
if err != nil {
log.Fatalf("密码加密失败: %v", err)
}
// 输出加密结果(可存储到数据库的 password 字段)
log.Printf("明文密码: %s\n加密后: %s", plainPwd, hashedPwd)
loginInputPwd := "admin" // 用户登录时输入的明文(正确)
// loginInputPwd := "wrong123" // 错误密码(测试用)
match, err := VerifyPassword(loginInputPwd, hashedPwd)
if err != nil {
log.Fatalf("验证异常: %v", err)
}
if match {
log.Println("验证成功!密码正确")
} else {
log.Println("验证失败!密码错误")
}
}