mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-04 00:10:25 +08:00
feat: 登录强制校验弱密码&关键信息加密传输
This commit is contained in:
@@ -7,28 +7,28 @@ type BizError struct {
|
||||
}
|
||||
|
||||
var (
|
||||
Success *BizError = NewBizErrCode(200, "success")
|
||||
BizErr *BizError = NewBizErrCode(400, "biz error")
|
||||
ServerError *BizError = NewBizErrCode(500, "server error")
|
||||
PermissionErr *BizError = NewBizErrCode(501, "token error")
|
||||
Success BizError = NewBizErrCode(200, "success")
|
||||
BizErr BizError = NewBizErrCode(400, "biz error")
|
||||
ServerError BizError = NewBizErrCode(500, "server error")
|
||||
PermissionErr BizError = NewBizErrCode(501, "token error")
|
||||
)
|
||||
|
||||
// 错误消息
|
||||
func (e *BizError) Error() string {
|
||||
func (e BizError) Error() string {
|
||||
return e.err
|
||||
}
|
||||
|
||||
// 错误码
|
||||
func (e *BizError) Code() int16 {
|
||||
func (e BizError) Code() int16 {
|
||||
return e.code
|
||||
}
|
||||
|
||||
// 创建业务逻辑错误结构体,默认为业务逻辑错误
|
||||
func NewBizErr(msg string) *BizError {
|
||||
return &BizError{code: BizErr.code, err: msg}
|
||||
func NewBizErr(msg string) BizError {
|
||||
return BizError{code: BizErr.code, err: msg}
|
||||
}
|
||||
|
||||
// 创建业务逻辑错误结构体,可设置指定错误code
|
||||
func NewBizErrCode(code int16, msg string) *BizError {
|
||||
return &BizError{code: code, err: msg}
|
||||
func NewBizErrCode(code int16, msg string) BizError {
|
||||
return BizError{code: code, err: msg}
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ func getErrMsg(rc *ReqCtx, err interface{}) string {
|
||||
|
||||
var errMsg string
|
||||
switch t := err.(type) {
|
||||
case *biz.BizError:
|
||||
case biz.BizError:
|
||||
errMsg = fmt.Sprintf("\n<-e errCode: %d, errMsg: %s", t.Code(), t.Error())
|
||||
case error:
|
||||
errMsg = fmt.Sprintf("\n<-e errMsg: %s\n%s", t.Error(), string(debug.Stack()))
|
||||
|
||||
@@ -62,7 +62,7 @@ func SuccessRes(g *gin.Context, data interface{}) {
|
||||
// 返回失败结果集
|
||||
func ErrorRes(g *gin.Context, err interface{}) {
|
||||
switch t := err.(type) {
|
||||
case *biz.BizError:
|
||||
case biz.BizError:
|
||||
g.JSON(http.StatusOK, model.Error(t))
|
||||
case error:
|
||||
g.JSON(http.StatusOK, model.ServerError())
|
||||
|
||||
@@ -44,7 +44,7 @@ func SuccessNoData() *Result {
|
||||
return &Result{Code: SuccessCode, Msg: SuccessMsg}
|
||||
}
|
||||
|
||||
func Error(bizerr *biz.BizError) *Result {
|
||||
func Error(bizerr biz.BizError) *Result {
|
||||
return &Result{Code: bizerr.Code(), Msg: bizerr.Error()}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/md5"
|
||||
"crypto/rand"
|
||||
"crypto/rsa"
|
||||
"crypto/x509"
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
"encoding/pem"
|
||||
"errors"
|
||||
)
|
||||
|
||||
// md5
|
||||
@@ -11,3 +18,115 @@ func Md5(str string) string {
|
||||
h.Write([]byte(str))
|
||||
return hex.EncodeToString(h.Sum(nil))
|
||||
}
|
||||
|
||||
// 系统统一RSA秘钥对
|
||||
var RsaPair []string
|
||||
|
||||
// 生成RSA私钥和公钥字符串
|
||||
// bits 证书大小
|
||||
// @return privateKeyStr publicKeyStr error
|
||||
func GenerateRSAKey(bits int) (string, string, error) {
|
||||
var privateKeyStr, publicKeyStr string
|
||||
|
||||
//GenerateKey函数使用随机数据生成器random生成一对具有指定字位数的RSA密钥
|
||||
//Reader是一个全局、共享的密码用强随机数生成器
|
||||
privateKey, err := rsa.GenerateKey(rand.Reader, bits)
|
||||
if err != nil {
|
||||
return privateKeyStr, publicKeyStr, err
|
||||
}
|
||||
//保存私钥
|
||||
//通过x509标准将得到的ras私钥序列化为ASN.1 的 DER编码字符串
|
||||
X509PrivateKey := x509.MarshalPKCS1PrivateKey(privateKey)
|
||||
//构建一个pem.Block结构体对象
|
||||
privateBlock := pem.Block{Type: "RSA Private Key", Bytes: X509PrivateKey}
|
||||
|
||||
privateBuf := new(bytes.Buffer)
|
||||
pem.Encode(privateBuf, &privateBlock)
|
||||
privateKeyStr = privateBuf.String()
|
||||
|
||||
//保存公钥
|
||||
//获取公钥的数据
|
||||
publicKey := privateKey.PublicKey
|
||||
//X509对公钥编码
|
||||
X509PublicKey, err := x509.MarshalPKIXPublicKey(&publicKey)
|
||||
if err != nil {
|
||||
return publicKeyStr, privateKeyStr, err
|
||||
}
|
||||
//创建一个pem.Block结构体对象
|
||||
publicBlock := pem.Block{Type: "RSA Public Key", Bytes: X509PublicKey}
|
||||
|
||||
publicBuf := new(bytes.Buffer)
|
||||
pem.Encode(publicBuf, &publicBlock)
|
||||
publicKeyStr = publicBuf.String()
|
||||
|
||||
return privateKeyStr, publicKeyStr, nil
|
||||
}
|
||||
|
||||
// rsa解密
|
||||
func RsaDecrypt(privateKeyStr string, data []byte) ([]byte, error) {
|
||||
block, _ := pem.Decode([]byte(privateKeyStr))
|
||||
if block == nil {
|
||||
return nil, errors.New("private key error")
|
||||
}
|
||||
|
||||
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rsa.DecryptPKCS1v15(rand.Reader, priv, data)
|
||||
}
|
||||
|
||||
// 使用系统默认的私钥解密
|
||||
// @param base64 字符串是否使用base64编码
|
||||
func DefaultRsaDecrypt(data string, useBase64 bool) (string, error) {
|
||||
// 空字符串不解密
|
||||
if data == "" {
|
||||
return "", nil
|
||||
}
|
||||
if useBase64 {
|
||||
if decodeBase64, err := base64.StdEncoding.DecodeString(data); err != nil {
|
||||
return "", err
|
||||
} else {
|
||||
data = string(decodeBase64)
|
||||
}
|
||||
}
|
||||
priKey, err := GetRsaPrivateKey()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
val, err := RsaDecrypt(priKey, []byte(data))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(val), nil
|
||||
}
|
||||
|
||||
// 获取系统的RSA公钥
|
||||
func GetRsaPublicKey() (string, error) {
|
||||
if len(RsaPair) == 2 {
|
||||
return RsaPair[1], nil
|
||||
}
|
||||
|
||||
privateKey, publicKey, err := GenerateRSAKey(1024)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
RsaPair = append(RsaPair, privateKey)
|
||||
RsaPair = append(RsaPair, publicKey)
|
||||
return publicKey, nil
|
||||
}
|
||||
|
||||
// 获取系统私钥
|
||||
func GetRsaPrivateKey() (string, error) {
|
||||
if len(RsaPair) == 2 {
|
||||
return RsaPair[0], nil
|
||||
}
|
||||
|
||||
privateKey, publicKey, err := GenerateRSAKey(1024)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
RsaPair = append(RsaPair, privateKey)
|
||||
RsaPair = append(RsaPair, publicKey)
|
||||
return privateKey, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user