Files
sunct 3c3bf53ae4 docs(website): 添加简记memo产品原型和UI设计规范文档
- 新增「简记memo」一体化小程序产品原型设计文档
- 新增简记memo完整版UI视觉设计规范和界面细节
- 添加IDEA项目配置文件.gitignore
- 创建404页面HTML文件,包含响应式布局和错误提示
- 添加关于页面HTML文件,展示品牌介绍和团队信息
- 实现AES加解密工具函数,支持请求体加密
- 添加用户协议页面基础框架
2026-07-31 14:12:32 +08:00

88 lines
2.2 KiB
Go

// AES加解密:请求体加密
package utils
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"simple-memo/global"
)
// 注意:这里不再直接初始化,等到配置加载后再赋值
var AESKey []byte
var AESIV []byte
// InitAES 初始化AES密钥(必须在配置加载后调用)
func InitAES() {
AESKey = []byte(global.VP.GetString("aes.key")) // 32位
AESIV = []byte(global.VP.GetString("aes.iv")) // 16位
}
// PKCS7Padding 填充(修复完成)
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padText := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padText...) // 这里加 ... 即可修复
}
// AESEncrypt 加密
func AESEncrypt(origData []byte) (string, error) {
block, err := aes.NewCipher(AESKey)
if err != nil {
return "", err
}
blockSize := block.BlockSize()
origData = PKCS7Padding(origData, blockSize)
blockMode := cipher.NewCBCEncrypter(block, AESIV)
encrypted := make([]byte, len(origData))
blockMode.CryptBlocks(encrypted, origData)
return base64.StdEncoding.EncodeToString(encrypted), nil
}
// AESDecrypt 解密
func AESDecrypt(encrypted string) ([]byte, error) {
block, err := aes.NewCipher(AESKey)
if err != nil {
return nil, err
}
decoded, err := base64.StdEncoding.DecodeString(encrypted)
if err != nil {
return nil, err
}
blockMode := cipher.NewCBCDecrypter(block, AESIV)
orig := make([]byte, len(decoded))
blockMode.CryptBlocks(orig, decoded)
// ========= 这里换成安全版去填充 =========
orig = PKCS7UnPaddingSafe(orig)
return orig, nil
}
// PKCS7UnPadding 去填充(原版保留,不删)
func PKCS7UnPadding(origData []byte) []byte {
length := len(origData)
if length == 0 {
return []byte{} // 空数据直接返回,不崩溃
}
unPadding := int(origData[length-1])
return origData[:length-unPadding]
}
// PKCS7UnPaddingSafe 安全去填充,永不 panic
func PKCS7UnPaddingSafe(origData []byte) []byte {
length := len(origData)
if length == 0 {
return []byte{}
}
unPadding := int(origData[length-1])
// ========= 安全校验:防止 slice 越界崩溃 =========
if unPadding < 1 || unPadding > length {
return origData
}
return origData[:length-unPadding]
}