Files
EdgeCommon/pkg/nodeutils/aes_utils.go

116 lines
2.6 KiB
Go
Raw Normal View History

2024-05-17 18:28:59 +08:00
// Copyright 2021 GoEdge CDN goedge.cdn@gmail.com. All rights reserved.
package nodeutils
import (
"encoding/base64"
"encoding/json"
"errors"
2023-08-11 15:26:59 +08:00
"fmt"
"github.com/iwind/TeaGo/maps"
"time"
)
// EncryptMap 加密
func EncryptMap(nodeUniqueId string, nodeSecret string, data maps.Map, timeout int32) (string, error) {
if data == nil {
data = maps.Map{}
}
var expiresAt int64
if timeout > 0 {
expiresAt = time.Now().Unix() + int64(timeout)
}
dataJSON, err := json.Marshal(maps.Map{
"expiresAt": expiresAt,
"data": data,
})
if err != nil {
2023-08-11 15:26:59 +08:00
return "", fmt.Errorf("marshal data to json failed: %w", err)
}
var method = &AES256CFBMethod{}
err = method.Init([]byte(nodeUniqueId), []byte(nodeSecret))
if err != nil {
return "", err
}
result, err := method.Encrypt(dataJSON)
if err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(result), nil
}
// DecryptMap 解密
func DecryptMap(nodeUniqueId string, nodeSecret string, encodedString string) (maps.Map, error) {
var method = &AES256CFBMethod{}
err := method.Init([]byte(nodeUniqueId), []byte(nodeSecret))
if err != nil {
return nil, err
}
encodedData, err := base64.StdEncoding.DecodeString(encodedString)
if err != nil {
2023-08-11 15:26:59 +08:00
return nil, fmt.Errorf("base64 decode failed: %w", err)
}
dataJSON, err := method.Decrypt(encodedData)
if err != nil {
return nil, err
}
var result = maps.Map{}
err = json.Unmarshal(dataJSON, &result)
if err != nil {
2023-08-11 15:26:59 +08:00
return nil, fmt.Errorf("unmarshal data failed: %w", err)
}
var expiresAt = result.GetInt64("expiresAt")
if expiresAt > 0 && expiresAt < time.Now().Unix() {
return nil, errors.New("data is expired")
}
return result.GetMap("data"), nil
}
// EncryptData 加密
func EncryptData(nodeUniqueId string, nodeSecret string, data []byte) (string, error) {
if len(data) == 0 {
return "", nil
}
var method = &AES256CFBMethod{}
err := method.Init([]byte(nodeUniqueId), []byte(nodeSecret))
if err != nil {
return "", err
}
result, err := method.Encrypt(data)
if err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(result), nil
}
// DecryptData 解密
func DecryptData(nodeUniqueId string, nodeSecret string, encodedString string) ([]byte, error) {
if len(encodedString) == 0 {
return nil, nil
}
var method = &AES256CFBMethod{}
err := method.Init([]byte(nodeUniqueId), []byte(nodeSecret))
if err != nil {
return nil, err
}
encodedData, err := base64.StdEncoding.DecodeString(encodedString)
if err != nil {
2023-08-11 15:26:59 +08:00
return nil, fmt.Errorf("base64 decode failed: %w", err)
}
return method.Decrypt(encodedData)
}