|
@@ -21,6 +21,7 @@ import (
|
|
|
"google.golang.org/protobuf/proto"
|
|
|
"google.golang.org/protobuf/types/known/anypb"
|
|
|
"io"
|
|
|
+ "io/ioutil"
|
|
|
"log"
|
|
|
"time"
|
|
|
)
|
|
@@ -40,7 +41,7 @@ func (d *DefaultRpcClient) WrapSign(request interface{}, doHandler func(ctx cont
|
|
|
utils.FileLog.Error("序列化请求失败:%v", err)
|
|
|
return
|
|
|
}
|
|
|
- sign, _ := d.signature(string(reqStr), 16)
|
|
|
+ timestamp, nonce, sign, _ := d.signature(string(reqStr), 16)
|
|
|
ctx := metadata.NewOutgoingContext(context.Background(), metadata.Pairs(
|
|
|
"nonce", nonce,
|
|
|
"timestamp", fmt.Sprintf("%d", timestamp),
|
|
@@ -90,35 +91,33 @@ func (d *DefaultRpcClient) generateNonceStr(length int) (string, error) {
|
|
|
}
|
|
|
|
|
|
type encryptedRequest struct {
|
|
|
- Message []byte `json:"ciphertext"`
|
|
|
- Nonce string `json:"nonce"` // 添加随机字符串
|
|
|
- Timestamp int64 `json:"timestamp"` // 添加时间戳
|
|
|
+ Message interface{} `json:"ciphertext"`
|
|
|
+ Nonce string `json:"nonce"` // 添加随机字符串
|
|
|
+ Timestamp int64 `json:"timestamp"` // 添加时间戳
|
|
|
}
|
|
|
|
|
|
-func (d *DefaultRpcClient) signature(req interface{}, nonceLen int) (encodedData string, err error) {
|
|
|
- nonceStr, err := d.generateNonceStr(nonceLen)
|
|
|
+func (d *DefaultRpcClient) signature(req interface{}, nonceLen int) (timestamp int64, nonceStr string, encodedData string, err error) {
|
|
|
+ nonceStr, err = d.generateNonceStr(nonceLen)
|
|
|
if err != nil {
|
|
|
utils.FileLog.Error("随机字符串生成失败: %v", err)
|
|
|
return
|
|
|
}
|
|
|
- message := req.(proto.Message)
|
|
|
- reqData, _ := anypb.New(message)
|
|
|
- reqBytes, _ := proto.Marshal(reqData)
|
|
|
+ timestamp = time.Now().UnixMilli()
|
|
|
// 构建加密后的数据结构
|
|
|
encryptedStruct := encryptedRequest{
|
|
|
- Message: reqBytes,
|
|
|
- Nonce: nonceStr, // 添加随机字符串
|
|
|
- Timestamp: time.Now().UnixMilli(), // 添加时间戳
|
|
|
+ Message: req,
|
|
|
+ Nonce: nonceStr, // 添加随机字符串
|
|
|
+ Timestamp: timestamp, // 添加时间戳
|
|
|
}
|
|
|
entryData, err := json.Marshal(encryptedStruct)
|
|
|
if err != nil {
|
|
|
utils.FileLog.Error("序列化加密后的数据失败: %v", err)
|
|
|
return
|
|
|
}
|
|
|
- fmt.Println(entryData)
|
|
|
+ fmt.Println(string(entryData))
|
|
|
// 使用私钥加密
|
|
|
var privateKey *rsa.PrivateKey
|
|
|
- privateKey, err = d.parsePrivateKeyFromPEM([]byte("-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAKCAQEA0Gh3c2fki27yLKMUPUqZhDa0vGRp01ca5Rbpd6RoZURIA4Ti\n1k/zf2jW0tJ1OUnkBiBtcfZ4d+6gPr1kdsdpxSjlV1PQfzaMtZg0ZKiHTw4xhJ+P\n/XCzIPJaUKAwKqb8U0gsXfZVcF0OEwWAgNxLzMhPlTiSAWaRUOumOHNexSRzG9UR\ny+v/UIVkuDXFwzb1aly93S0Elp7cDPQA0FCLqiwofnNdPTJ1BiXa1OO8UFXuV16H\nw0JeYdl+GWUf8Q4uTKUesclnBkLgOUaXSJQqfNwqSBj39H4vRTBKX1eiqhCwt3/l\nwBEpWW8YHkfEssclh0x2xf0714e/H3BuwLwdWwIDAQABAoIBAQCyQvkRfKcvYOnC\npoc0We/v+D8l+ZnPTO1TUQLH9JfbLsmOQQcqG18C9zDxSVU9eGeTmf8jgJfQtgrZ\nP3SEaNOe8fkhdi6b8ZPv7E28X67FPzW55CXsuY5uuv3ngu1QPl8L+WsBwCeaoe3c\n9VLSZhxsAFaaI7Y3fn0Dw1z9YimI47ZSHra1xo9JM9EZybVYi8HaIoame9fs+TaK\nulr5nDjuRqPFhvVGpa/+S0S75ArW4VKrWp97cQ3D1xw2Fz0jP3eHndCErTYhj8MB\n10AFCndNKEIrwMPN5M426TbBLJY0vcIPYg0v4lSzwwAhYnNNmxMmroRLnD22ohdf\n687g52vRAoGBAOy6iiJxqW1mLNDKtwANI2XJBnoHbh8lPR3ZYlNybLeR49dFC7Qw\n5pv//rMybvWNG8obacQ0GiLXmlaajXFrpL9K+7qkg4W1VvjCvUo/Qk7He/sLOiXW\n/HuAOKZOhuLBoOzbDjDBHYy+eXDjzgqCrHpnI0wZ8uLahSUeTNSSgiNjAoGBAOFf\nuLnIMeV5kaNssvz+2iZ2W3aEW90fgNz8gy3VwzEarEGo7nalcq9vODwFHQNlZuE5\nBdzYXWE8Fjn/yJLipPxGXzPvGyZP4qUKgN8Mek39RJqvV3Mgtt0WG6IZpo0E0by0\nTmThlI0xJzi4Px01ip6fdhlJJPPC+yFayLzqtIupAoGBAJf7DtIcPNUSgvUtIB31\nUWN4kyLnAEkYpEs0lA7U6H1WOXusRV5TAsrmqEOtvlUBWfUAcn/Xn2v9FYZCRUqq\n/CMf5csm8ZV3HbYpeFNhl5VyNuOuio9encxAPp5uzeRowYMvA8ZDRVBlvRu/9TkE\nOe1/p8ak5i3EczSoZlUXFlvXAoGBANx5N80G+0jx1Hd7Lt4wslhOEMuwT+3Rk86b\nd/iu1XSEE19oU1/eGoNk2i5dEjTwTeSmVAXn4/HrRhMXFrAa6Cui7B9yGa0xGRc7\nXzbUjhEdYq+wOGx35GwD5KR/U19BB60C9m3Z/+jf3O6vz45TgngKpw21cGDGrcXD\nefzV3imBAoGAI3Md0ap1zmLVpM8NLCA9JxPPQiQAq0VmCGrEjeEk+sVn09lkESdb\nVDiu0VNGfWKsY+7hUC1qjBQ1ZCR4NFkwD6QwBsovrni6rK3f/4qRRmP8ORK9ASIi\nKw8stl7KvZdCltTobaVPFA90s+zgUsr9W6Q+gUPv2I/rmFWqpbJRARc=\n-----END RSA PRIVATE KEY-----\n"))
|
|
|
+ privateKey, err = d.parsePrivateKeyFromPEM([]byte(""))
|
|
|
if err != nil {
|
|
|
utils.FileLog.Error("私钥解析失败: %v", err)
|
|
|
return
|
|
@@ -145,19 +144,15 @@ func (d *DefaultRpcClient) signature(req interface{}, nonceLen int) (encodedData
|
|
|
|
|
|
// 解析RSA公钥
|
|
|
func (d *DefaultRpcClient) parsePrivateKeyFromPEM(pemBytes []byte) (privateKey *rsa.PrivateKey, err error) {
|
|
|
- block, _ := pem.Decode(pemBytes)
|
|
|
+ pemBlock, err := ioutil.ReadFile("./conf/rsa_private_key.pem")
|
|
|
+ block, _ := pem.Decode(pemBlock)
|
|
|
if block == nil {
|
|
|
utils.FileLog.Error("公钥解析失败")
|
|
|
return nil, errors.New("公钥解析失败")
|
|
|
}
|
|
|
- pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
|
|
|
+ privateKey, err = x509.ParsePKCS1PrivateKey(block.Bytes)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
-
|
|
|
- privateKey, ok := pubInterface.(*rsa.PrivateKey)
|
|
|
- if !ok {
|
|
|
- return nil, errors.New("RSA公钥格式错误")
|
|
|
- }
|
|
|
return
|
|
|
}
|