feat: adjust api send token
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
)
|
||||
|
||||
//// getDeterministicSalt 根据字符串内容生成确定性 salt(范围 0~255)
|
||||
//func getDeterministicSalt(text string) byte {
|
||||
// var sum int
|
||||
// for i := 0; i < len(text); i++ {
|
||||
// sum = (sum + int(text[i])*(i+1)) & 0xFF
|
||||
// }
|
||||
// return byte(sum)
|
||||
//}
|
||||
|
||||
//// EncryptTokenHex 按照确定性 salt + 异或规则生成十六进制 token
|
||||
//// 规则:首字节为 salt;其余字节为 char ^ key ^ ((salt + idx) & 0xFF)
|
||||
//func EncryptTokenHex(text string, key byte) string {
|
||||
// salt := getDeterministicSalt(text)
|
||||
// // 预分配:2个hex字符的salt + 每个字符2个hex
|
||||
// out := make([]byte, 0, 2+len(text)*2)
|
||||
// // 写入salt
|
||||
// out = append(out, []byte(hex.EncodeToString([]byte{salt}))...)
|
||||
// // 写入加密数据
|
||||
// for i := 0; i < len(text); i++ {
|
||||
// b := text[i] ^ key ^ byte((int(salt)+i)&0xFF)
|
||||
// enc := make([]byte, 2)
|
||||
// hex.Encode(enc, []byte{b})
|
||||
// out = append(out, enc...)
|
||||
// }
|
||||
// return string(out)
|
||||
//}
|
||||
|
||||
// DecryptTokenHex 解析十六进制 token 为原始字符串
|
||||
// 规则:首字节为salt;后续字节与 key ^ ((salt + idx) & 0xFF) 异或
|
||||
func DecryptTokenHex(enc string, key byte) (string, error) {
|
||||
if enc == "" {
|
||||
return "", errors.New("empty token")
|
||||
}
|
||||
bs, err := hex.DecodeString(enc)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if len(bs) < 1 {
|
||||
return "", errors.New("invalid token length")
|
||||
}
|
||||
salt := bs[0]
|
||||
out := make([]byte, len(bs)-1)
|
||||
for i := 1; i < len(bs); i++ {
|
||||
out[i-1] = bs[i] ^ key ^ byte((int(salt)+i-1)&0xFF)
|
||||
}
|
||||
return string(out), nil
|
||||
}
|
||||
Reference in New Issue
Block a user