This commit is contained in:
新亮
2020-12-26 13:52:34 +08:00
parent 155f5fca1b
commit 34f85ad14b
12 changed files with 346 additions and 119 deletions
+43
View File
@@ -2,3 +2,46 @@
host = '127.0.0.1'
port = 3306
[aes]
key = 'IgkibX71IEf382PT'
iv = 'IgkibX71IEf382PT'
[rsa]
private = '-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEA1O3p0JN0/RrP7eY3f81izPf16FS0WMNGCJkd+y5c6yBzUvN0
IEeoxiIWIBhoMKH0pzlzBg0rfttojSodOgNom/UCAzAYEgdIsNee5LSN/7e0T2/Q
vsIAHINuA8gI8fGoGiSA2TEzpUo6aVXwhZT34GGRdrSJ+m4iVk/Kt95tavBNk+ND
VSeb5xAjxBchT5BjAMMlE0ffGZb0MMjjO5+e9Tn8f99M2VMqpzXHXZzv1ABmqufz
S20iWcSvnjhWcJ9hiKwO8Z30GgJyACmml+HMxLYEFN9h2MWYgxLm9Z0rLMrWwMM+
E2rCs8tsxAD5sO9RZMJPl1C0FIsMR53ngqbzowIDAQABAoIBAQCO1RE1ItUlO6kj
Un0ENAgEqojAUqGvsT33Yo7kAZO+/cOeb0UEqk0iq5bf7L9ncBynWDg6ZPc6X3/g
wdFdKxAvHck9zjM3VL+EMP+bNyrR0K8ZYk5Kx+Q/PEK+Mp8dfRdgggAUsZaNWB+a
rVVspiMo1wo28KBl5x8NevTnJkOLqXAyB7UyLWqnOL1fb988lZvZPR7ZUYroVIZa
pyXtZcafIJeKyQ3bvWI5+eFqOe61Z4Bx1+TpfZ3fKfSDW0vhxzNqaimOa8jSXtMJ
jMeOctL4nZ0TPo/jS3I+XlaH4ZQlFLuUWGscpxwfEeBN23I8HRLkZXJsw66yvRN3
s4bUKPXRAoGBAP/3oSZAECvfsYYzs76tnrAmR/0GxCqgguxDlWn5DowQzdWFOdHC
ZbTo/hUVoMSQnO1EKCFlnBS+wg/3TuIzUO0ewC1aeT7qHbOMDl0zKbNpS2Z9/j+U
zro+qz7XmkWolMCfmDrCrw9CtCxcMSII+ajbI8SAgFVMz9XnDt+xW9E9AoGBANT0
4F6kCUJTEyqf2+v84tjQ2wGIF6XtZPU9JR806zeMyahQ9F6z3hY8BYb0tIy5b3uJ
VlJ9TG1qg/t59TWxIq43mYSUJHe0aJi3ilooObQtHlhPu8nwmmX47sX0PyG2hMoD
kBVxTpTDmBaDz7O9uBnlMXJN5qEygctaixpEbmZfAoGBAMBA9kEMjRjnAyeRXcgy
D6aumhNqKZz6wltCx864yjxZwsBFOJBcOpgPCAg+HmqFU9jCAIJVF05dmNT1I8Ky
WG5BUoa+FaMzpOtenstRylh/Far9pyGKW1t4BpdEyRLY9CFZvbUk1OfZagqHlD/E
DgDN16eX/MwUzWYUDg/l3tjhAoGBAKGip/ZNjVWRFpggs9z/mfK1O7WC5Wgksp9N
ZLK2CN6l9p3RrFmBLk00C4HulGfHi+15RVLhFbRqx3iFje/N3iPbwaMWikNtZIKd
tN5Pb9To9gJTqpZRD+/cLOeFRrHBBjMK1z7fPKS/fN2B+JFVq7nD827t3+J0In4F
4FT0odMDAoGBAJk3ELB/FHY8xzZ4jF1wG/a1CK681Xm6SuU5KIELDSAUNoou6OPG
mS8gU20MMPAeV2z7khyDcSxlHsUyL73eLeaakbQov9NMW7cc99XX4wnP4W7FRpmr
QbHmKuHIRFHCFv+XX8c0aK2mDZMUlzJdy4FgD/YCEZ7kZMZKyvZW/ZuV
-----END RSA PRIVATE KEY-----'
public = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1O3p0JN0/RrP7eY3f81i
zPf16FS0WMNGCJkd+y5c6yBzUvN0IEeoxiIWIBhoMKH0pzlzBg0rfttojSodOgNo
m/UCAzAYEgdIsNee5LSN/7e0T2/QvsIAHINuA8gI8fGoGiSA2TEzpUo6aVXwhZT3
4GGRdrSJ+m4iVk/Kt95tavBNk+NDVSeb5xAjxBchT5BjAMMlE0ffGZb0MMjjO5+e
9Tn8f99M2VMqpzXHXZzv1ABmqufzS20iWcSvnjhWcJ9hiKwO8Z30GgJyACmml+HM
xLYEFN9h2MWYgxLm9Z0rLMrWwMM+E2rCs8tsxAD5sO9RZMJPl1C0FIsMR53ngqbz
owIDAQAB
-----END PUBLIC KEY-----'
+81
View File
@@ -1,13 +1,18 @@
package demo
import (
"fmt"
"net/url"
"time"
"github.com/xinliangnote/go-gin-api/internal/pkg/configs"
"github.com/xinliangnote/go-gin-api/internal/pkg/core"
"github.com/xinliangnote/go-gin-api/internal/pkg/errno"
"github.com/xinliangnote/go-gin-api/internal/pkg/jsonparse"
"github.com/xinliangnote/go-gin-api/pkg/aes"
"github.com/xinliangnote/go-gin-api/pkg/httpclient"
"github.com/xinliangnote/go-gin-api/pkg/md5"
"github.com/xinliangnote/go-gin-api/pkg/rsa"
"go.uber.org/zap"
)
@@ -116,3 +121,79 @@ func (d *Demo) User() core.HandlerFunc {
c.SetPayload(errno.OK.WithData(data))
}
}
func (d *Demo) RsaTest() core.HandlerFunc {
return func(c core.Context) {
startTime := time.Now()
encryptStr := "param_1=xxx&param_2=xxx&ak=xxx&ts=1111111111"
count := 500
cfg := configs.Get()
rsaPublic := rsa.NewPublic(cfg.Rsa.Public)
rsaPrivate := rsa.NewPrivate(cfg.Rsa.Private)
for i := 0; i < count; i++ {
// 生成签名
sn, err := rsaPublic.Encrypt(encryptStr)
if err != nil {
d.logger.Error("rsa public encrypt err", zap.Error(err))
}
// 验证签名
_, err = rsaPrivate.Decrypt(sn)
if err != nil {
d.logger.Error("rsa private decrypt err", zap.Error(err))
}
}
c.SetPayload(errno.OK.
WithData(fmt.Sprintf("%v次 - %v", count, time.Since(startTime))),
)
}
}
func (d *Demo) AesTest() core.HandlerFunc {
return func(c core.Context) {
startTime := time.Now()
encryptStr := "param_1=xxx&param_2=xxx&ak=xxx&ts=1111111111"
count := 1000000
cfg := configs.Get()
aes := aes.New(cfg.Aes.Key, cfg.Aes.Iv)
for i := 0; i < count; i++ {
// 生成签名
sn, err := aes.Encrypt(encryptStr)
if err != nil {
d.logger.Error("aes encrypt err", zap.Error(err))
}
// 验证签名
_, err = aes.Decrypt(sn)
if err != nil {
d.logger.Error("aes decrypt err", zap.Error(err))
}
}
c.SetPayload(errno.OK.
WithData(fmt.Sprintf("%v次 - %v", count, time.Since(startTime))))
}
}
func (d *Demo) MD5Test() core.HandlerFunc {
return func(c core.Context) {
startTime := time.Now()
encryptStr := "param_1=xxx&param_2=xxx&ak=xxx&ts=1111111111"
count := 1000000
md5 := md5.New()
for i := 0; i < count; i++ {
// 生成签名
md5.Encrypt(encryptStr)
// 验证签名
md5.Encrypt(encryptStr)
}
c.SetPayload(errno.OK.
WithData(fmt.Sprintf("%v次 - %v", count, time.Since(startTime))),
)
}
}
-57
View File
@@ -1,57 +0,0 @@
package test
import (
"fmt"
"time"
"github.com/xinliangnote/go-gin-api/internal/pkg/core"
"github.com/xinliangnote/go-gin-api/internal/pkg/errno"
"github.com/xinliangnote/go-util/aes"
"github.com/xinliangnote/go-util/md5"
"github.com/xinliangnote/go-util/rsa"
)
func Md5Test(c core.Context) {
startTime := time.Now()
appSecret := "IgkibX71IEf382PT"
encryptStr := "param_1=xxx&param_2=xxx&ak=xxx&ts=1111111111"
count := 1000000
for i := 0; i < count; i++ {
// 生成签名
md5.MD5(appSecret + encryptStr + appSecret)
// 验证签名
md5.MD5(appSecret + encryptStr + appSecret)
}
c.SetPayload(errno.OK.WithData(fmt.Sprintf("%v次 - %v", count, time.Since(startTime))))
}
func AesTest(c core.Context) {
startTime := time.Now()
appSecret := "IgkibX71IEf382PT"
encryptStr := "param_1=xxx&param_2=xxx&ak=xxx&ts=1111111111"
count := 1000000
for i := 0; i < count; i++ {
// 生成签名
sn, _ := aes.Encrypt(encryptStr, []byte(appSecret), appSecret)
// 验证签名
aes.Decrypt(sn, []byte(appSecret), appSecret)
}
c.SetPayload(errno.OK.WithData(fmt.Sprintf("%v次 - %v", count, time.Since(startTime))))
}
func RsaTest(c core.Context) {
startTime := time.Now()
encryptStr := "param_1=xxx&param_2=xxx&ak=xxx&ts=1111111111"
count := 500
for i := 0; i < count; i++ {
// 生成签名
sn, _ := rsa.PublicEncrypt(encryptStr, "rsa/public.pem")
// 验证签名
rsa.PrivateDecrypt(sn, "rsa/private.pem")
}
c.SetPayload(errno.OK.WithData(fmt.Sprintf("%v次 - %v", count, time.Since(startTime))))
}
+4 -13
View File
@@ -38,23 +38,14 @@ func NewHTTPMux(logger *zap.Logger) (core.Mux, error) {
d.GET("get/:name", demoHandler.Get(), core.DisableJournal)
d.POST("post", demoHandler.Post(), core.DisableJournal)
// 测试加密性能
d.GET("/rsa/test", demoHandler.RsaTest())
d.GET("/aes/test", demoHandler.AesTest())
d.GET("/md5/test", demoHandler.MD5Test())
}
// 测试链路追踪
//mux.GET("/jaeger_test", jaeger_conn.JaegerTest)
// 测试加密性能
//TestRouter := mux.Group("/test")
//{
// // 测试 MD5 组合 的性能
// TestRouter.GET("/md5", core.Handle(test.Md5Test))
//
// // 测试 AES 的性能
// TestRouter.GET("/aes", core.Handle(test.AesTest))
//
// // 测试 RSA 的性能
// TestRouter.GET("/rsa", core.Handle(test.RsaTest))
//}
return mux, nil
}
+9 -3
View File
@@ -14,9 +14,15 @@ type Config struct {
Port int `mapstructure:"port"`
} `mapstructure:"db"`
Signature struct {
Secrets map[string]string `mapstructure:"secrets"`
} `mapstructure:"signature"`
Aes struct {
Key string `mapstructure:"key"`
Iv string `mapstructure:"iv"`
} `mapstructure:"aes"`
Rsa struct {
Private string `mapstructure:"private"`
Public string `mapstructure:"public"`
} `mapstructure:"rsa"`
}
func init() {
+3 -4
View File
@@ -80,7 +80,7 @@ type Context interface {
Logger() *zap.Logger
setLogger(logger *zap.Logger)
GetPayload() interface{}
GetPayload() errno.Error
SetPayload(payload errno.Error)
Header() http.Header
@@ -178,13 +178,12 @@ func (c *context) setLogger(logger *zap.Logger) {
c.ctx.Set(_LoggerName, logger)
}
func (c *context) GetPayload() interface{} {
func (c *context) GetPayload() errno.Error {
payload, _ := c.ctx.Get(_PayloadName)
return payload
return payload.(errno.Error)
}
func (c *context) SetPayload(payload errno.Error) {
payload.WithID(c.Journal().ID())
c.ctx.Set(_PayloadName, payload)
}
+9 -6
View File
@@ -262,17 +262,20 @@ func New(logger *zap.Logger, options ...Option) (Mux, error) {
}
}
if x := context.Journal(); x != nil {
context.SetHeader(journal.JournalHeader, x.ID())
if ctx.Writer.Status() == http.StatusNotFound {
return
}
response := context.GetPayload()
if response != nil {
ctx.JSON(http.StatusOK, response)
if x := context.Journal(); x != nil {
context.SetHeader(journal.JournalHeader, x.ID())
response.WithID(x.ID())
} else {
response.WithID("")
}
if ctx.Writer.Status() == http.StatusNotFound {
return
if response != nil {
ctx.JSON(http.StatusOK, response)
}
var j *journal.Journal
+80
View File
@@ -0,0 +1,80 @@
package aes
import (
"bytes"
cryptoAes "crypto/aes"
"crypto/cipher"
"encoding/base64"
)
var _ Aes = (*aes)(nil)
type Aes interface {
i()
// Encrypt 加密
Encrypt(encryptStr string) (string, error)
// Decrypt 解密
Decrypt(decryptStr string) (string, error)
}
type aes struct {
key string
iv string
}
func New(key, iv string) Aes {
return &aes{
key: key,
iv: iv,
}
}
func (a *aes) i() {}
func (a *aes) Encrypt(encryptStr string) (string, error) {
encryptBytes := []byte(encryptStr)
block, err := cryptoAes.NewCipher([]byte(a.key))
if err != nil {
return "", err
}
blockSize := block.BlockSize()
encryptBytes = pkcs5Padding(encryptBytes, blockSize)
blockMode := cipher.NewCBCEncrypter(block, []byte(a.iv))
encrypted := make([]byte, len(encryptBytes))
blockMode.CryptBlocks(encrypted, encryptBytes)
return base64.URLEncoding.EncodeToString(encrypted), nil
}
func (a *aes) Decrypt(decryptStr string) (string, error) {
decryptBytes, err := base64.URLEncoding.DecodeString(decryptStr)
if err != nil {
return "", err
}
block, err := cryptoAes.NewCipher([]byte(a.key))
if err != nil {
return "", err
}
blockMode := cipher.NewCBCDecrypter(block, []byte(a.iv))
decrypted := make([]byte, len(decryptBytes))
blockMode.CryptBlocks(decrypted, decryptBytes)
decrypted = pkcs5UnPadding(decrypted)
return string(decrypted), nil
}
func pkcs5Padding(cipherText []byte, blockSize int) []byte {
padding := blockSize - len(cipherText)%blockSize
padText := bytes.Repeat([]byte{byte(padding)}, padding)
return append(cipherText, padText...)
}
func pkcs5UnPadding(decrypted []byte) []byte {
length := len(decrypted)
unPadding := int(decrypted[length-1])
return decrypted[:(length - unPadding)]
}
+28
View File
@@ -0,0 +1,28 @@
package md5
import (
cryptoMD5 "crypto/md5"
"encoding/hex"
)
var _ MD5 = (*md5)(nil)
type MD5 interface {
i()
// Encrypt 加密
Encrypt(encryptStr string) string
}
type md5 struct{}
func New() MD5 {
return &md5{}
}
func (m *md5) i() {}
func (m *md5) Encrypt(encryptStr string) string {
s := cryptoMD5.New()
s.Write([]byte(encryptStr))
return hex.EncodeToString(s.Sum(nil))
}
+89
View File
@@ -0,0 +1,89 @@
package rsa
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
)
var _ Public = (*rsaPub)(nil)
var _ Private = (*rsaPri)(nil)
type Public interface {
i()
// Encrypt 加密
Encrypt(encryptStr string) (string, error)
}
type Private interface {
i()
// Decrypt 解密
Decrypt(decryptStr string) (string, error)
}
type rsaPub struct {
PublicKey string
}
type rsaPri struct {
PrivateKey string
}
func NewPublic(publicKey string) Public {
return &rsaPub{
PublicKey: publicKey,
}
}
func NewPrivate(privateKey string) Private {
return &rsaPri{
PrivateKey: privateKey,
}
}
func (pub *rsaPub) i() {}
func (pub *rsaPub) Encrypt(encryptStr string) (string, error) {
// pem 解码
block, _ := pem.Decode([]byte(pub.PublicKey))
// x509 解码
publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return "", err
}
// 类型断言
publicKey := publicKeyInterface.(*rsa.PublicKey)
//对明文进行加密
encryptedStr, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, []byte(encryptStr))
if err != nil {
return "", err
}
//返回密文
return base64.URLEncoding.EncodeToString(encryptedStr), nil
}
func (pri *rsaPri) i() {}
func (pri *rsaPri) Decrypt(decryptStr string) (string, error) {
// pem 解码
block, _ := pem.Decode([]byte(pri.PrivateKey))
// X509 解码
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return "", err
}
decryptBytes, err := base64.URLEncoding.DecodeString(decryptStr)
//对密文进行解密
decrypted, _ := rsa.DecryptPKCS1v15(rand.Reader, privateKey, decryptBytes)
//返回明文
return string(decrypted), nil
}
-27
View File
@@ -1,27 +0,0 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEA1O3p0JN0/RrP7eY3f81izPf16FS0WMNGCJkd+y5c6yBzUvN0
IEeoxiIWIBhoMKH0pzlzBg0rfttojSodOgNom/UCAzAYEgdIsNee5LSN/7e0T2/Q
vsIAHINuA8gI8fGoGiSA2TEzpUo6aVXwhZT34GGRdrSJ+m4iVk/Kt95tavBNk+ND
VSeb5xAjxBchT5BjAMMlE0ffGZb0MMjjO5+e9Tn8f99M2VMqpzXHXZzv1ABmqufz
S20iWcSvnjhWcJ9hiKwO8Z30GgJyACmml+HMxLYEFN9h2MWYgxLm9Z0rLMrWwMM+
E2rCs8tsxAD5sO9RZMJPl1C0FIsMR53ngqbzowIDAQABAoIBAQCO1RE1ItUlO6kj
Un0ENAgEqojAUqGvsT33Yo7kAZO+/cOeb0UEqk0iq5bf7L9ncBynWDg6ZPc6X3/g
wdFdKxAvHck9zjM3VL+EMP+bNyrR0K8ZYk5Kx+Q/PEK+Mp8dfRdgggAUsZaNWB+a
rVVspiMo1wo28KBl5x8NevTnJkOLqXAyB7UyLWqnOL1fb988lZvZPR7ZUYroVIZa
pyXtZcafIJeKyQ3bvWI5+eFqOe61Z4Bx1+TpfZ3fKfSDW0vhxzNqaimOa8jSXtMJ
jMeOctL4nZ0TPo/jS3I+XlaH4ZQlFLuUWGscpxwfEeBN23I8HRLkZXJsw66yvRN3
s4bUKPXRAoGBAP/3oSZAECvfsYYzs76tnrAmR/0GxCqgguxDlWn5DowQzdWFOdHC
ZbTo/hUVoMSQnO1EKCFlnBS+wg/3TuIzUO0ewC1aeT7qHbOMDl0zKbNpS2Z9/j+U
zro+qz7XmkWolMCfmDrCrw9CtCxcMSII+ajbI8SAgFVMz9XnDt+xW9E9AoGBANT0
4F6kCUJTEyqf2+v84tjQ2wGIF6XtZPU9JR806zeMyahQ9F6z3hY8BYb0tIy5b3uJ
VlJ9TG1qg/t59TWxIq43mYSUJHe0aJi3ilooObQtHlhPu8nwmmX47sX0PyG2hMoD
kBVxTpTDmBaDz7O9uBnlMXJN5qEygctaixpEbmZfAoGBAMBA9kEMjRjnAyeRXcgy
D6aumhNqKZz6wltCx864yjxZwsBFOJBcOpgPCAg+HmqFU9jCAIJVF05dmNT1I8Ky
WG5BUoa+FaMzpOtenstRylh/Far9pyGKW1t4BpdEyRLY9CFZvbUk1OfZagqHlD/E
DgDN16eX/MwUzWYUDg/l3tjhAoGBAKGip/ZNjVWRFpggs9z/mfK1O7WC5Wgksp9N
ZLK2CN6l9p3RrFmBLk00C4HulGfHi+15RVLhFbRqx3iFje/N3iPbwaMWikNtZIKd
tN5Pb9To9gJTqpZRD+/cLOeFRrHBBjMK1z7fPKS/fN2B+JFVq7nD827t3+J0In4F
4FT0odMDAoGBAJk3ELB/FHY8xzZ4jF1wG/a1CK681Xm6SuU5KIELDSAUNoou6OPG
mS8gU20MMPAeV2z7khyDcSxlHsUyL73eLeaakbQov9NMW7cc99XX4wnP4W7FRpmr
QbHmKuHIRFHCFv+XX8c0aK2mDZMUlzJdy4FgD/YCEZ7kZMZKyvZW/ZuV
-----END RSA PRIVATE KEY-----
-9
View File
@@ -1,9 +0,0 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1O3p0JN0/RrP7eY3f81i
zPf16FS0WMNGCJkd+y5c6yBzUvN0IEeoxiIWIBhoMKH0pzlzBg0rfttojSodOgNo
m/UCAzAYEgdIsNee5LSN/7e0T2/QvsIAHINuA8gI8fGoGiSA2TEzpUo6aVXwhZT3
4GGRdrSJ+m4iVk/Kt95tavBNk+NDVSeb5xAjxBchT5BjAMMlE0ffGZb0MMjjO5+e
9Tn8f99M2VMqpzXHXZzv1ABmqufzS20iWcSvnjhWcJ9hiKwO8Z30GgJyACmml+HM
xLYEFN9h2MWYgxLm9Z0rLMrWwMM+E2rCs8tsxAD5sO9RZMJPl1C0FIsMR53ngqbz
owIDAQAB
-----END PUBLIC KEY-----