crypt

package
v0.0.13 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 26, 2026 License: BSD-2-Clause Imports: 17 Imported by: 0

README

Crypt - 加密解密工具包

提供全面的加密解密功能,包括对称加密、非对称加密、密码哈希、数字签名、编码转换等。

特性

  • 对称加密 - 支持 AES-128/192/256,使用 GCM 模式提供认证加密
  • 非对称加密 - 支持 RSA-1024/2048/3072/4096,使用 OAEP 填充
  • 密码哈希 - 支持 Bcrypt(推荐)和 PBKDF2 两种安全算法
  • 数字签名 - 支持 HMAC(SHA256/SHA512)和 ECDSA(P-256)
  • 编码转换 - Base64、Hex 编码解码,支持 URL 安全格式
  • 安全工具 - 随机数生成、常数时间比较(防时序攻击)

快速开始

package main

import (
	"fmt"
	"log"

	"github.com/lite-lake/litecore-go/util/crypt"
)

func main() {
	// Base64 编码解码
	encoded := crypt.Crypt.Base64Encode("Hello, World!")
	fmt.Println("Base64 编码:", encoded)

	decoded, err := crypt.Crypt.Base64Decode(encoded)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Base64 解码:", decoded)

	// AES 对称加密
	key, _ := crypt.Crypt.GenerateAESKey(crypt.AES256)
	encrypted, _ := crypt.Crypt.AESEncryptToBase64("敏感信息", key)
	fmt.Println("AES 加密:", encrypted)

	decrypted, _ := crypt.Crypt.AESDecryptFromBase64(encrypted, key)
	fmt.Println("AES 解密:", decrypted)

	// 密码哈希
	hash, _ := crypt.Crypt.BcryptHash("mypassword123", 10)
	fmt.Println("密码哈希:", hash)

	verified := crypt.Crypt.BcryptVerify("mypassword123", hash)
	fmt.Println("密码验证:", verified)
}

使用场景

场景 1:用户密码加密

在用户注册、登录场景中,使用 Bcrypt 哈希密码:

// 用户注册时加密密码
func RegisterUser(username, password string) error {
	// 生成密码哈希(cost 参数决定计算强度)
	hashedPassword, err := crypt.Crypt.BcryptHash(password, 10)
	if err != nil {
		return err
	}

	// 存储用户名和哈希后的密码
	user := User{
		Username: username,
		Password: hashedPassword, // 不要存储明文密码
	}
	return db.Create(&user)
}

// 用户登录时验证密码
func LoginUser(username, password string) bool {
	// 从数据库获取用户
	user := db.FindUserByUsername(username)
	if user == nil {
		return false
	}

	// 验证密码
	return crypt.Crypt.BcryptVerify(password, user.Password)
}
场景 2:敏感数据加密存储

使用 AES 加密存储敏感信息(如身份证号、银行卡号):

// 加密敏感数据
func EncryptSensitiveData(plaintext string, encryptionKey []byte) (string, error) {
	return crypt.Crypt.AESEncryptToBase64(plaintext, encryptionKey)
}

// 解密敏感数据
func DecryptSensitiveData(ciphertext string, encryptionKey []byte) (string, error) {
	return crypt.Crypt.AESDecryptFromBase64(ciphertext, encryptionKey)
}

// 使用示例
func SaveUserCard(userID int, cardNumber string) error {
	// 从环境变量或配置获取加密密钥
	encryptionKey := []byte(os.Getenv("ENCRYPTION_KEY"))

	// 加密银行卡号
	encryptedCard, err := EncryptSensitiveData(cardNumber, encryptionKey)
	if err != nil {
		return err
	}

	// 存储加密后的数据
	userCard := UserCard{
		UserID:    userID,
		CardNumber: encryptedCard, // 加密存储
	}
	return db.Create(&userCard)
}
场景 3:API 签名验证

使用 HMAC 签名确保 API 请求的完整性和真实性:

// 生成 API 签名
func GenerateAPISignature(data []byte, secret string) string {
	return crypt.Crypt.HMACSignHexWithSHA256(data, []byte(secret))
}

// 验证 API 签名
func VerifyAPISignature(data []byte, signature, secret string) bool {
	expectedSig := GenerateAPISignature(data, secret)
	// 使用常数时间比较防止时序攻击
	return crypt.Crypt.SecureEqual(signature, expectedSig)
}

// 使用示例
func HandleAPIRequest(ctx *gin.Context) {
	// 获取请求参数
	data := []byte(ctx.Query("data"))
	signature := ctx.GetHeader("X-Signature")
	secret := os.Getenv("API_SECRET")

	// 验证签名
	if !VerifyAPISignature(data, signature, secret) {
		ctx.JSON(401, gin.H{"error": "Invalid signature"})
		return
	}

	// 处理请求
	ctx.JSON(200, gin.H{"status": "success"})
}
场景 4:混合加密(RSA + AES)

大量数据加密时,使用 RSA 加密 AES 密钥,AES 加密实际数据:

// 混合加密
func HybridEncrypt(plaintext string, publicKey *rsa.PublicKey) ([]byte, string, error) {
	// 1. 生成随机 AES 密钥
	aesKey, err := crypt.Crypt.GenerateAESKey(crypt.AES256)
	if err != nil {
		return nil, "", err
	}

	// 2. 使用 RSA 加密 AES 密钥
	encryptedKey, err := crypt.Crypt.RSAEncrypt(aesKey, publicKey)
	if err != nil {
		return nil, "", err
	}

	// 3. 使用 AES 加密实际数据
	encryptedData, err := crypt.Crypt.AESEncryptToBase64(plaintext, aesKey)
	if err != nil {
		return nil, "", err
	}

	return encryptedKey, encryptedData, nil
}

// 混合解密
func HybridDecrypt(encryptedKey []byte, encryptedData string, privateKey *rsa.PrivateKey) (string, error) {
	// 1. 使用 RSA 解密 AES 密钥
	aesKey, err := crypt.Crypt.RSADecrypt(encryptedKey, privateKey)
	if err != nil {
		return "", err
	}

	// 2. 使用 AES 解密实际数据
	plaintext, err := crypt.Crypt.AESDecryptFromBase64(encryptedData, aesKey)
	if err != nil {
		return "", err
	}

	return plaintext, nil
}

// 使用示例
func SendSecureData(data string) error {
	// 获取接收方的公钥
	receiverPublicKey := getReceiverPublicKey()

	// 混合加密
	encryptedKey, encryptedData, err := HybridEncrypt(data, receiverPublicKey)
	if err != nil {
		return err
	}

	// 发送加密数据
	sendData(encryptedKey, encryptedData)
	return nil
}

Base64 编码解码

基本使用
// 字符串编码解码
encoded := crypt.Crypt.Base64Encode("Hello, World!")
decoded, _ := crypt.Crypt.Base64Decode("SGVsbG8sIFdvcmxkIQ==")

// 字节数组编码解码
data := []byte{0x48, 0x65, 0x6c, 0x6c, 0x6f}
encodedBytes := crypt.Crypt.Base64EncodeBytes(data)
decodedBytes, _ := crypt.Crypt.Base64DecodeBytes("SGVsbG8=")
URL 安全编码
// URL 安全的 Base64 编码
encoded := crypt.Crypt.Base64URLEncode("Hello, World!")
decoded, _ := crypt.Crypt.Base64URLDecode(encoded)

// 验证字符串是否为有效的 Base64
isValid := crypt.Crypt.IsBase64(encoded)

Hex 编码解码

// 十六进制编码解码
encoded := crypt.Crypt.HexEncode("Hello")
decoded, _ := crypt.Crypt.HexDecode("48656c6c6f")

// 字节数组编码解码
data := []byte{0x00, 0xFF, 0xAA, 0x55}
encodedBytes := crypt.Crypt.HexEncodeBytes(data)
decodedBytes, _ := crypt.Crypt.HexDecodeBytes("00ffaa55")

// 验证字符串是否为有效的十六进制
isValid := crypt.Crypt.IsHex(encoded)

AES 对称加密

生成密钥
// 生成 AES-256 密钥
key, _ := crypt.Crypt.GenerateAESKey(crypt.AES256)

// 生成十六进制格式的密钥
keyHex, _ := crypt.Crypt.GenerateAESKeyHex(crypt.AES256)
加密解密
// 方法 1: 字节数组
plaintext := []byte("敏感信息")
ciphertext, _ := crypt.Crypt.AESEncrypt(plaintext, key)
decrypted, _ := crypt.Crypt.AESDecrypt(ciphertext, key)

// 方法 2: Base64 编码(推荐)
encrypted, _ := crypt.Crypt.AESEncryptToBase64("敏感信息", key)
decrypted, _ := crypt.Crypt.AESDecryptFromBase64(encrypted, key)

RSA 非对称加密

生成密钥对
// 生成 RSA-2048 密钥对
privateKey, publicKey, _ := crypt.Crypt.GenerateRSAKeys(crypt.RSA2048)
加密解密
// 方法 1: 字节数组
plaintext := []byte("秘密消息")
ciphertext, _ := crypt.Crypt.RSAEncrypt(plaintext, publicKey)
decrypted, _ := crypt.Crypt.RSADecrypt(ciphertext, privateKey)

// 方法 2: Base64 编码(推荐)
encrypted, _ := crypt.Crypt.RSAEncryptToBase64("秘密消息", publicKey)
decrypted, _ := crypt.Crypt.RSADecryptFromBase64(encrypted, privateKey)

密码哈希

Bcrypt 哈希(推荐)
// 生成哈希
hash, _ := crypt.Crypt.BcryptHash("mypassword123", 10)

// 验证密码
isCorrect := crypt.Crypt.BcryptVerify("mypassword123", hash)

成本因子建议:

  • cost = 4:测试环境
  • cost = 10:生产环境(推荐)
  • cost = 12+:高安全性
PBKDF2 哈希
// 生成盐值
salt, _ := crypt.Crypt.GenerateSalt(16)

// 生成哈希
hash := crypt.Crypt.PBKDF2Hash("mypassword123", string(salt), 10000, 32)

// 验证密码
isCorrect := crypt.Crypt.PBKDF2Verify("mypassword123", string(salt), hash, 10000, 32)

参数建议:

  • salt:至少 16 字节
  • iterations:最少 10000 次,推荐 100000+ 次
  • keyLen:通常 32 字节(256 位)

HMAC 签名

data := []byte("需要签名的数据")
key := []byte("密钥")

// 使用 SHA256 的便捷方法
signature := crypt.Crypt.HMACSignWithSHA256(data, key)
signatureHex := crypt.Crypt.HMACSignHexWithSHA256(data, key)
signatureBase64 := crypt.Crypt.HMACSignBase64(data, key, crypto.SHA256.New)

// 验证签名
isValid := crypt.Crypt.HMACVerify(data, key, signature, crypto.SHA256.New)

ECDSA 数字签名

// 生成密钥对
privateKey, publicKey, _ := crypt.Crypt.GenerateECDSAKeys()

// 签名
data := []byte("需要签名的数据")
signature, _ := crypt.Crypt.ECDSASign(data, privateKey)
signatureHex, _ := crypt.Crypt.ECDSASignHex(data, privateKey)

// 验证签名
isValid := crypt.Crypt.ECDSAVerify(data, signature, publicKey)
isValid, _ := crypt.Crypt.ECDSAVerifyHex(data, signatureHex, publicKey)

安全工具函数

随机数生成
// 生成随机字节
randomBytes, _ := crypt.Crypt.GenerateRandomBytes(16)

// 生成随机字符串
randomString, _ := crypt.Crypt.GenerateRandomString(32)
常数时间比较
// 防止时序攻击的比较
a := []byte("sensitive-data")
b := []byte("sensitive-data")
isEqual := crypt.Crypt.ConstantTimeCompare(a, b)

// 安全字符串比较
isEqual = crypt.Crypt.SecureEqual("password123", "password123")

API 参考

编码解码
函数 说明
Base64Encode(data string) string Base64 编码字符串
Base64EncodeBytes(data []byte) string Base64 编码字节数组
Base64Decode(data string) (string, error) Base64 解码为字符串
Base64DecodeBytes(data string) ([]byte, error) Base64 解码为字节数组
Base64URLEncode(data string) string URL 安全的 Base64 编码
Base64URLDecode(data string) (string, error) URL 安全的 Base64 解码
IsBase64(s string) bool 检查字符串是否为有效的 Base64 编码
Hex 编码解码
函数 说明
HexEncode(data string) string 十六进制编码字符串
HexEncodeBytes(data []byte) string 十六进制编码字节数组
HexDecode(data string) (string, error) 十六进制解码为字符串
HexDecodeBytes(data string) ([]byte, error) 十六进制解码为字节数组
IsHex(s string) bool 检查字符串是否为有效的十六进制编码
AES 对称加密
函数 说明
GenerateAESKey(keySize AESKeySize) ([]byte, error) 生成 AES 密钥
GenerateAESKeyHex(keySize AESKeySize) (string, error) 生成十六进制 AES 密钥
AESEncrypt(plaintext, key []byte) ([]byte, error) AES 加密
AESEncryptToBase64(plaintext string, key []byte) (string, error) AES 加密并 Base64 编码
AESDecrypt(ciphertext, key []byte) ([]byte, error) AES 解密
AESDecryptFromBase64(ciphertext string, key []byte) (string, error) 从 Base64 字符串 AES 解密
RSA 非对称加密
函数 说明
GenerateRSAKeys(bits RSABits) (*rsa.PrivateKey, *rsa.PublicKey, error) 生成 RSA 密钥对
RSAEncrypt(plaintext []byte, publicKey *rsa.PublicKey) ([]byte, error) RSA 公钥加密
RSAEncryptToBase64(plaintext string, publicKey *rsa.PublicKey) (string, error) RSA 加密并 Base64 编码
RSADecrypt(ciphertext []byte, privateKey *rsa.PrivateKey) ([]byte, error) RSA 私钥解密
RSADecryptFromBase64(ciphertext string, privateKey *rsa.PrivateKey) (string, error) 从 Base64 字符串 RSA 解密
密码哈希
函数 说明
BcryptHash(password string, cost int) (string, error) Bcrypt 密码哈希
BcryptVerify(password, hash string) bool Bcrypt 密码验证
PBKDF2Hash(password, salt string, iterations, keyLen int) string PBKDF2 密码哈希
PBKDF2Verify(password, salt, hash string, iterations, keyLen int) bool PBKDF2 密码验证
GenerateSalt(length int) ([]byte, error) 生成随机盐值
GenerateSaltHex(length int) (string, error) 生成十六进制盐值
HMAC 签名
函数 说明
HMACSign(data, key []byte, hashFunc func() hash.Hash) []byte HMAC 签名
HMACSignHex(data, key []byte, hashFunc func() hash.Hash) string HMAC 签名并转十六进制
HMACSignBase64(data, key []byte, hashFunc func() hash.Hash) string HMAC 签名并转 Base64
HMACVerify(data, key, signature []byte, hashFunc func() hash.Hash) bool HMAC 验证
HMACSignWithSHA256(data, key []byte) []byte 使用 SHA256 的 HMAC 签名
HMACSignHexWithSHA256(data, key []byte) string 使用 SHA256 的 HMAC 签名(十六进制)
HMACSignWithSHA512(data, key []byte) []byte 使用 SHA512 的 HMAC 签名
HMACSignHexWithSHA512(data, key []byte) string 使用 SHA512 的 HMAC 签名(十六进制)
ECDSA 数字签名
函数 说明
GenerateECDSAKeys() (*ecdsa.PrivateKey, *ecdsa.PublicKey, error) 生成 ECDSA 密钥对
ECDSASign(data []byte, privateKey *ecdsa.PrivateKey) ([]byte, error) ECDSA 签名
ECDSASignHex(data []byte, privateKey *ecdsa.PrivateKey) (string, error) ECDSA 签名并转十六进制
ECDSAVerify(data, signature []byte, publicKey *ecdsa.PublicKey) bool ECDSA 验证
ECDSAVerifyHex(data []byte, signatureHex string, publicKey *ecdsa.PublicKey) (bool, error) ECDSA 验证十六进制签名
工具函数
函数 说明
ConstantTimeCompare(a, b []byte) bool 常数时间比较(防时序攻击)
SecureEqual(a, b string) bool 安全字符串比较
GenerateRandomBytes(length int) ([]byte, error) 生成随机字节
GenerateRandomString(length int) (string, error) 生成随机字符串
EncodeKey(key []byte) string 编码密钥为可传输格式
DecodeKey(encodedKey string) ([]byte, error) 解码密钥

常量定义

AES 密钥大小
const (
	AES128 AESKeySize = 16  // 128 位密钥
	AES192 AESKeySize = 24  // 192 位密钥
	AES256 AESKeySize = 32  // 256 位密钥
)
RSA 密钥位数
const (
	RSA1024 RSABits = 1024  // 不推荐用于生产环境
	RSA2048 RSABits = 2048  // 推荐
	RSA3072 RSABits = 3072  // 高安全性
	RSA4096 RSABits = 4096  // 最高安全性
)

错误处理

所有加密解密函数均返回 error 类型,应始终检查并处理错误:

encrypted, err := crypt.Crypt.AESEncryptToBase64(plaintext, key)
if err != nil {
	log.Printf("加密失败: %v", err)
	return
}

安全最佳实践

1. 密钥管理
// ✅ 从环境变量获取密钥
key := []byte(os.Getenv("AES_ENCRYPTION_KEY"))

// ❌ 避免硬编码密钥
key := []byte("my-secret-key-123")
2. 密码存储
// ✅ 使用 Bcrypt 哈希密码
hash, _ := crypt.Crypt.BcryptHash(password, 12)

// ❌ 避免使用普通哈希
hash := sha256.Sum256([]byte(password))
3. 安全比较
// ✅ 使用常数时间比较
if crypt.Crypt.SecureEqual(receivedMAC, calculatedMAC) {
	// 验证通过
}
4. 随机数生成
// ✅ 使用加密安全的随机数
randomBytes, _ := crypt.Crypt.GenerateRandomBytes(16)

// ❌ 避免使用不安全的随机数
rand.Seed(time.Now().UnixNano())

性能考虑

  • Bcrypt 成本因子:生产环境推荐 10-12,使哈希操作耗时 100-250ms
  • PBKDF2 迭代次数:推荐至少 100,000 次,根据服务器性能调整
  • AES vs RSA:RSA 较慢,大量数据加密建议使用 AES+RSA 混合加密

Documentation

Overview

Package crypt 提供全面的加密解密功能,包括对称加密、非对称加密、哈希、签名、Base64编码等

Index

Constants

This section is empty.

Variables

View Source
var Crypt = &cryptEngine{}

Crypt 默认的加密操作实例

Functions

This section is empty.

Types

type AESKeySize

type AESKeySize int

AESKeySize AES密钥大小枚举

const (
	// AES128 128位AES密钥
	AES128 AESKeySize = 16
	// AES192 192位AES密钥
	AES192 AESKeySize = 24
	// AES256 256位AES密钥
	AES256 AESKeySize = 32
)

type RSABits

type RSABits int

RSABits RSA密钥位数枚举

const (
	// RSA1024 1024位RSA密钥
	RSA1024 RSABits = 1024
	// RSA2048 2048位RSA密钥
	RSA2048 RSABits = 2048
	// RSA3072 3072位RSA密钥
	RSA3072 RSABits = 3072
	// RSA4096 4096位RSA密钥
	RSA4096 RSABits = 4096
)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL