parent
9f11e1a05d
commit
ec7e8a4d41
@ -1,3 +1,58 @@ |
|||||||
# utils |
# utils通用包 |
||||||
|
|
||||||
通用包 |
<!-- TOC --> |
||||||
|
* [utils通用包](#utils通用包) |
||||||
|
* [安装](#安装) |
||||||
|
* [通用包](#通用包) |
||||||
|
* [pagination](#pagination) |
||||||
|
* [transport:通用http ResponseEncoder](#transport通用http-responseencoder) |
||||||
|
* [meta:跨服务meta信息设置和获取](#meta跨服务meta信息设置和获取) |
||||||
|
* [encrypt:对称加密](#encrypt对称加密) |
||||||
|
<!-- TOC --> |
||||||
|
|
||||||
|
## 安装 |
||||||
|
|
||||||
|
1. 设置私有仓库 |
||||||
|
|
||||||
|
```shell |
||||||
|
go env -w GOPRIVATE=gitea.drugeyes.vip |
||||||
|
``` |
||||||
|
|
||||||
|
2. 设置git |
||||||
|
|
||||||
|
```shell |
||||||
|
git config --global url."ssh://gitea@gitea.drugeyes.vip".insteadOf "https://gitea.drugeyes.vip" |
||||||
|
``` |
||||||
|
|
||||||
|
3. 拉取对应版本 |
||||||
|
|
||||||
|
```shell |
||||||
|
go get gitea.drugeyes.vip/pharnexbase/tools@v1.0.0 |
||||||
|
``` |
||||||
|
|
||||||
|
## 通用包 |
||||||
|
|
||||||
|
### pagination |
||||||
|
|
||||||
|
* v1 |
||||||
|
|
||||||
|
> 说明 |
||||||
|
|
||||||
|
### transport:通用http ResponseEncoder |
||||||
|
|
||||||
|
* v1 |
||||||
|
|
||||||
|
> 通用http ResponseEncoder |
||||||
|
|
||||||
|
### meta:跨服务meta信息设置和获取 |
||||||
|
|
||||||
|
* v1 |
||||||
|
|
||||||
|
> 跨服务meta信息设置和获取 |
||||||
|
> - user(基础用户信息) |
||||||
|
|
||||||
|
### encrypt:对称加密 |
||||||
|
|
||||||
|
* v1 |
||||||
|
|
||||||
|
> 对称加密,目前包含:SHA1PRNG |
@ -0,0 +1,102 @@ |
|||||||
|
package encrypt |
||||||
|
|
||||||
|
import ( |
||||||
|
"crypto/aes" |
||||||
|
"crypto/hmac" |
||||||
|
"crypto/sha1" |
||||||
|
"errors" |
||||||
|
) |
||||||
|
|
||||||
|
//AesEncryptECBSha1prng java AES 加密 SHA1PRNG
|
||||||
|
func AesEncryptECBSha1prng(src []byte, key []byte) ([]byte, error) { |
||||||
|
sha1prngKey, err := GetSha1prngKey(key, 128) |
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
return AesEncryptECB(src, sha1prngKey), nil |
||||||
|
} |
||||||
|
|
||||||
|
//AesDecryptECBSha1prng java AES 解密 SHA1PRNG
|
||||||
|
func AesDecryptECBSha1prng(encrypted []byte, key []byte) ([]byte, error) { |
||||||
|
sha1prngKey, err := GetSha1prngKey(key, 128) |
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
return AesDecryptECB(encrypted, sha1prngKey), nil |
||||||
|
} |
||||||
|
|
||||||
|
//AesEncryptECB AES-128-ECB 加密,(php:openssl_encrypt($string, 'AES-128-ECB', $key, OPENSSL_RAW_DATA))
|
||||||
|
func AesEncryptECB(src []byte, key []byte) []byte { |
||||||
|
c, _ := aes.NewCipher(generateKey(key)) |
||||||
|
length := (len(src) + aes.BlockSize) / aes.BlockSize |
||||||
|
plain := make([]byte, length*aes.BlockSize) |
||||||
|
copy(plain, src) |
||||||
|
pad := byte(len(plain) - len(src)) |
||||||
|
for i := len(src); i < len(plain); i++ { |
||||||
|
plain[i] = pad |
||||||
|
} |
||||||
|
encrypted := make([]byte, len(plain)) |
||||||
|
// 分组分块加密
|
||||||
|
for bs, be := 0, c.BlockSize(); bs <= len(src); bs, be = bs+c.BlockSize(), be+c.BlockSize() { |
||||||
|
c.Encrypt(encrypted[bs:be], plain[bs:be]) |
||||||
|
} |
||||||
|
|
||||||
|
return encrypted |
||||||
|
} |
||||||
|
|
||||||
|
//AesDecryptECB AES-128-ECB 解密
|
||||||
|
func AesDecryptECB(encrypted []byte, key []byte) []byte { |
||||||
|
c, _ := aes.NewCipher(generateKey(key)) |
||||||
|
decrypted := make([]byte, len(encrypted)) |
||||||
|
|
||||||
|
for bs, be := 0, c.BlockSize(); bs < len(encrypted); bs, be = bs+c.BlockSize(), be+c.BlockSize() { |
||||||
|
c.Decrypt(decrypted[bs:be], encrypted[bs:be]) |
||||||
|
} |
||||||
|
|
||||||
|
trim := 0 |
||||||
|
if len(decrypted) > 0 { |
||||||
|
trim = len(decrypted) - int(decrypted[len(decrypted)-1]) |
||||||
|
} |
||||||
|
|
||||||
|
return decrypted[:trim] |
||||||
|
} |
||||||
|
|
||||||
|
// GetSha1prngKey 模拟 java SHA1PRNG 处理,(php:substr(openssl_digest(openssl_digest($key, 'sha1', true), 'sha1', true), 0, 16))
|
||||||
|
func GetSha1prngKey(keyBytes []byte, encryptLength int) ([]byte, error) { |
||||||
|
hashs := Sha1(Sha1(keyBytes)) |
||||||
|
maxLen := len(hashs) |
||||||
|
realLen := encryptLength / 8 |
||||||
|
if realLen > maxLen { |
||||||
|
return nil, errors.New("invalid length") |
||||||
|
} |
||||||
|
|
||||||
|
return hashs[0:realLen], nil |
||||||
|
} |
||||||
|
|
||||||
|
//Sha1 Sha1
|
||||||
|
func Sha1(data []byte) []byte { |
||||||
|
h := sha1.New() |
||||||
|
h.Write(data) |
||||||
|
return h.Sum(nil) |
||||||
|
} |
||||||
|
|
||||||
|
// HmacSha1 HmacSha1
|
||||||
|
func HmacSha1(string, secret string) []byte { |
||||||
|
mac := hmac.New(sha1.New, []byte(secret)) |
||||||
|
mac.Write([]byte(string)) |
||||||
|
|
||||||
|
return mac.Sum(nil) |
||||||
|
} |
||||||
|
|
||||||
|
func generateKey(key []byte) (genKey []byte) { |
||||||
|
genKey = make([]byte, 16) |
||||||
|
copy(genKey, key) |
||||||
|
for i := 16; i < len(key); { |
||||||
|
for j := 0; j < 16 && i < len(key); j, i = j+1, i+1 { |
||||||
|
genKey[j] ^= key[i] |
||||||
|
} |
||||||
|
} |
||||||
|
return genKey |
||||||
|
} |
@ -0,0 +1,75 @@ |
|||||||
|
package meta |
||||||
|
|
||||||
|
import ( |
||||||
|
"context" |
||||||
|
"encoding/json" |
||||||
|
"errors" |
||||||
|
"github.com/go-kratos/kratos/v2/metadata" |
||||||
|
) |
||||||
|
|
||||||
|
const ( |
||||||
|
userMetaKey = "x-md-global-user" |
||||||
|
) |
||||||
|
|
||||||
|
var UserErr = errors.New("userinfo error") |
||||||
|
|
||||||
|
// User 用户信息
|
||||||
|
type User struct { |
||||||
|
// 用户id
|
||||||
|
Id int32 `json:"id"` |
||||||
|
// 邮箱
|
||||||
|
Email string `json:"email"` |
||||||
|
// 账号
|
||||||
|
Username string `json:"username"` |
||||||
|
// 手机号
|
||||||
|
Phone string `json:"phone"` |
||||||
|
// 昵称
|
||||||
|
Nickname string `json:"nickname"` |
||||||
|
// 头像
|
||||||
|
Avatar string `json:"avatar"` |
||||||
|
// 状态 1=正常;2=封禁
|
||||||
|
Status int32 `json:"status"` |
||||||
|
} |
||||||
|
|
||||||
|
// SetUserMetaClient 设置用户meta信息
|
||||||
|
func SetUserMetaClient(ctx context.Context, user *User) context.Context { |
||||||
|
userInfo, _ := json.Marshal(user) |
||||||
|
return metadata.AppendToClientContext(ctx, userMetaKey, string(userInfo)) |
||||||
|
} |
||||||
|
|
||||||
|
// GetUserMetaClient 获取用户meta信息
|
||||||
|
func GetUserMetaClient(ctx context.Context) (*User, error) { |
||||||
|
if meta, ok := metadata.FromClientContext(ctx); ok { |
||||||
|
user := &User{} |
||||||
|
if json.Unmarshal([]byte(meta.Get(userMetaKey)), user) != nil { |
||||||
|
return nil, UserErr |
||||||
|
} |
||||||
|
return user, nil |
||||||
|
} |
||||||
|
return nil, UserErr |
||||||
|
} |
||||||
|
|
||||||
|
// SetUserMetaServer 设置用户meta信息
|
||||||
|
func SetUserMetaServer(ctx context.Context, user *User) context.Context { |
||||||
|
userInfo, _ := json.Marshal(user) |
||||||
|
|
||||||
|
var meta metadata.Metadata |
||||||
|
var ok bool |
||||||
|
if meta, ok = metadata.FromServerContext(ctx); ok { |
||||||
|
meta.Set(userMetaKey, string(userInfo)) |
||||||
|
} |
||||||
|
|
||||||
|
return metadata.NewServerContext(ctx, meta) |
||||||
|
} |
||||||
|
|
||||||
|
// GetUserMetaServer 获取用户meta信息
|
||||||
|
func GetUserMetaServer(ctx context.Context) (*User, error) { |
||||||
|
if meta, ok := metadata.FromServerContext(ctx); ok { |
||||||
|
user := &User{} |
||||||
|
if json.Unmarshal([]byte(meta.Get(userMetaKey)), user) != nil { |
||||||
|
return nil, UserErr |
||||||
|
} |
||||||
|
return user, nil |
||||||
|
} |
||||||
|
return nil, UserErr |
||||||
|
} |
Loading…
Reference in new issue