Files
lone-services/bff/internal/response/crypto.go
T
2026-08-05 17:37:32 +08:00

110 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package response
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"math/rand"
"strings"
"time"
)
var (
isDebug bool
encryptKey string
)
// Init 初始化响应加密相关配置(对应旧项目 base.is_debug / encrypt.encrypt_key
func Init(debug bool, key string) {
isDebug = debug
encryptKey = key
}
func GetConfigBool(key string) bool {
if key == "base.is_debug" {
return isDebug
}
return false
}
func GetConfigString(key string) string {
if key == "encrypt.encrypt_key" {
return encryptKey
}
return ""
}
func GetEncrypt(key string, nums ...int8) string {
original := GetConfigString(key)
str := original
//TODO 后台切换到新版时开启
//for _, num := range nums {
// str = str[num:] + str[:num]
//}
return str
}
// GetRandString 取得随机字符串:使用字符串拼接
func GetRandString(length int) string {
if length < 1 {
return ""
}
char := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
charArr := strings.Split(char, "")
charlen := len(charArr)
ran := rand.New(rand.NewSource(time.Now().Unix()))
var rchar string = ""
for i := 1; i <= length; i++ {
rchar = rchar + charArr[ran.Intn(charlen)]
}
return rchar
}
type Crypto struct{}
// EncryptKey 加密
func (c Crypto) EncryptKey(data []byte, key string) (map[string]string, Error) {
info, err := c.aesCBCEncryptKey(data, key)
if err != nil {
return nil, err
}
return info, nil
}
func (c Crypto) aesCBCEncryptKey(data []byte, key string) (map[string]string, Error) {
k := []byte(key)
iv := GetRandString(NumberSixteen)
// 分组密钥
block, err := aes.NewCipher(k)
if err != nil {
return nil, ErrorEncryptAesKeyError
}
// 获取密钥块的长度
blockSize := block.BlockSize()
// 补充码
data = c.pKCS7Padding(data, blockSize)
// 加密模式
blockMode := cipher.NewCBCEncrypter(block, []byte(iv))
// 创建数组
crypted := make([]byte, len(data))
// 加密
blockMode.CryptBlocks(crypted, data)
return map[string]string{
"data": base64.StdEncoding.EncodeToString(crypted),
"iv": iv,
}, nil
}
func (c Crypto) pKCS7Padding(ciphertext []byte, blockSize int) []byte {
// 判断缺少几位长度,最少为 1,最多为 blockSize
padding := blockSize - len(ciphertext)%blockSize
// 补足位数,把切片 []byte{byte(padding)} 复制 padding 个
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}