mirror of
https://github.com/xinliangnote/go-gin-api.git
synced 2024-04-21 12:31:46 +00:00
upgrade
This commit is contained in:
@@ -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-----'
|
||||
|
||||
|
||||
@@ -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¶m_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¶m_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¶m_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))),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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¶m_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¶m_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¶m_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))))
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)]
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
Reference in New Issue
Block a user