- 新增「简记memo」一体化小程序产品原型设计文档 - 新增简记memo完整版UI视觉设计规范和界面细节 - 添加IDEA项目配置文件.gitignore - 创建404页面HTML文件,包含响应式布局和错误提示 - 添加关于页面HTML文件,展示品牌介绍和团队信息 - 实现AES加解密工具函数,支持请求体加密 - 添加用户协议页面基础框架
88 lines
2.2 KiB
Go
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]
|
|
}
|