竹简文档

工具库高级功能

密码加密、哈希计算与安全密钥生成

工具库高级功能

Bamboo Base 提供了密码加密、哈希计算和安全密钥生成等高级工具函数。

密码加密

基于 bcrypt 的密码加密,额外增加 Base64 编码层。

加密流程

明文密码 → Base64 编码 → bcrypt 哈希 → 密文

函数列表

// 加密密码(返回字节切片)
func EncryptPassword(pass string) ([]byte, error)

// 加密密码(返回字节切片,panic on error)
func MustEncryptPassword(pass string) []byte

// 加密密码(返回字符串)
func EncryptPasswordString(pass string) (string, error)

// 加密密码(返回字符串,panic on error)
func MustEncryptPasswordString(pass string) string

// 验证密码
func VerifyPassword(inputPass, hashPass string) error

// 验证密码(返回布尔值)
func IsPasswordValid(inputPass, hashPass string) bool

使用示例

import xUtil "github.com/bamboo-services/bamboo-base-go/utility"

// 注册时加密密码
hash, err := xUtil.EncryptPasswordString("userPassword123")
if err != nil {
    log.Fatal(err)
}
// 存储 hash 到数据库

// 登录时验证密码
if xUtil.IsPasswordValid(inputPassword, storedHash) {
    // 密码正确,登录成功
} else {
    // 密码错误
}

完整注册登录示例

type User struct {
    ID       int64  `gorm:"primaryKey"`
    Username string `gorm:"uniqueIndex"`
    Password string
}

// 注册
func Register(username, password string) error {
    hash := xUtil.MustEncryptPasswordString(password)
    user := User{
        Username: username,
        Password: hash,
    }
    return db.Create(&user).Error
}

// 登录
func Login(username, password string) (*User, error) {
    var user User
    if err := db.Where("username = ?", username).First(&user).Error; err != nil {
        return nil, err
    }

    if !xUtil.IsPasswordValid(password, user.Password) {
        return nil, errors.New("密码错误")
    }

    return &user, nil
}

哈希计算

SHA-256

// 字符串 SHA-256 哈希
func Hash(data string) string

// 字节切片 SHA-256 哈希
func HashBytes(data []byte) string

返回值:64 位小写十六进制字符串

xUtil.Hash("hello")
// "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"

MD5

// 字符串 MD5 哈希
func MD5Hash(str string) string

// 字节切片 MD5 哈希
func MD5HashBytes(data []byte) string

返回值:32 位小写十六进制字符串

xUtil.MD5Hash("hello")
// "5d41402abc4b2a76b9719d911017c592"

使用场景

// 文件完整性校验
fileHash := xUtil.HashBytes(fileContent)

// 缓存键生成
cacheKey := "user:" + xUtil.MD5Hash(userID)

// 签名计算
signature := xUtil.Hash(data + secret)

安全密钥生成

长密钥

生成 67 字符的安全密钥(cs_ + 64 位十六进制):

func GenerateLongSecurityKey() string

格式cs_ + 两个 UUID 拼接(去除连字符)

xUtil.GenerateLongSecurityKey()
// "cs_550e8400e29b41d4a716446655440000123e4567e89b12d3a456426614174000"

短密钥

生成 35 字符的安全密钥(cs_ + 32 位十六进制):

func GenerateSecurityKey() string

格式cs_ + 单个 UUID(去除连字符)

xUtil.GenerateSecurityKey()
// "cs_550e8400e29b41d4a716446655440000"

密钥验证

验证字符串是否为有效的安全密钥格式:

func VerifySecurityKey(input string) bool

验证规则

  • cs_ 开头
  • 后跟 64 或 32 个十六进制字符
xUtil.VerifySecurityKey("cs_550e8400e29b41d4a716446655440000") // true
xUtil.VerifySecurityKey("invalid_key") // false

使用场景

// API 密钥生成
apiKey := xUtil.GenerateLongSecurityKey()

// 会话令牌
sessionToken := xUtil.GenerateSecurityKey()

// 验证 API 密钥格式
if !xUtil.VerifySecurityKey(apiKey) {
    return errors.New("无效的 API 密钥格式")
}

完整示例

package main

import (
    "fmt"
    xUtil "github.com/bamboo-services/bamboo-base-go/utility"
)

func main() {
    // 密码加密
    password := "mySecurePassword123"
    hash := xUtil.MustEncryptPasswordString(password)
    fmt.Println("密码哈希:", hash)

    // 密码验证
    if xUtil.IsPasswordValid(password, hash) {
        fmt.Println("密码验证成功")
    }

    // 哈希计算
    data := "important data"
    sha256Hash := xUtil.Hash(data)
    md5Hash := xUtil.MD5Hash(data)
    fmt.Println("SHA-256:", sha256Hash)
    fmt.Println("MD5:", md5Hash)

    // 安全密钥
    longKey := xUtil.GenerateLongSecurityKey()
    shortKey := xUtil.GenerateSecurityKey()
    fmt.Println("长密钥:", longKey)
    fmt.Println("短密钥:", shortKey)

    // 验证密钥
    fmt.Println("长密钥有效:", xUtil.VerifySecurityKey(longKey))
    fmt.Println("短密钥有效:", xUtil.VerifySecurityKey(shortKey))
}

安全建议

  1. 密码存储:始终使用 EncryptPassword 加密后存储,永不存储明文
  2. 密钥保护:生成的安全密钥应安全存储,避免泄露
  3. MD5 限制:MD5 不应用于安全敏感场景,仅用于校验和缓存键
  4. SHA-256 优先:安全相关的哈希计算优先使用 SHA-256

下一步

On this page