gobase/utils/utils.go

134 lines
2.9 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package utils
import (
"bytes"
"crypto/md5"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/hex"
"encoding/pem"
"os"
"path/filepath"
"reflect"
"runtime"
"strings"
)
// GetMd5ToLow Md5加密小写
func GetMd5ToLow(str string) string {
m := md5.New()
m.Write([]byte(str))
result := hex.EncodeToString(m.Sum(nil))
result = strings.ToLower(result)
return result
}
// InArrary 是否在数组
func InArrary(arr interface{}, ele interface{}) int {
if reflect.TypeOf(arr).Kind() != reflect.Slice && reflect.TypeOf(arr).Kind() != reflect.Array {
return -1
}
//数组为空
if reflect.ValueOf(arr).Len() == 0 {
return 1
}
// 数组和元素不一致
if reflect.ValueOf(arr).Index(0).Type().Kind() != reflect.TypeOf(ele).Kind() {
return 1
}
for i := 0; i < reflect.ValueOf(arr).Len(); i++ {
if reflect.ValueOf(arr).Index(i).Interface() ==
reflect.ValueOf(ele).Interface() {
return 0
}
}
return 1
}
// 将程序变成守护进程。
func Daemonize() {
if runtime.GOOS == "windows" {
// windows不支持进程守护,直接return
return
}
if runtime.GOOS == "linux" {
if os.Getppid() != 1 { //判断当其是否是子进程当父进程return之后子进程会被 系统1 号进程接管
filePath, _ := filepath.Abs(os.Args[0]) //将命令行参数中执行文件路径转换成可用路径
os.StartProcess(filePath, os.Args[1:], &os.ProcAttr{Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}})
os.Exit(0)
} else {
return
}
}
}
/*
* RSA私钥解密
*/
func RSADecrypt(src []byte, buf []byte) ([]byte, error) {
block, _ := pem.Decode(buf)
if block == nil {
return nil, nil
}
// 解析出一个der编码的私钥
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
// 私钥解密
result, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, src)
if err != nil {
return nil, err
}
return result, nil
}
func RSAEncrypt(src []byte, buf []byte) ([]byte, error) {
block, _ := pem.Decode(buf)
if block == nil {
return nil, nil
}
// 解析一个der编码的公钥
publicKey, err := x509.ParsePKCS1PublicKey(block.Bytes)
if err != nil {
return nil, err
}
// 公钥加密
result, _ := rsa.EncryptPKCS1v15(rand.Reader, publicKey, src)
return result, nil
}
func GenRsaKey(bits int) ([]byte, []byte) {
pribuf := bytes.NewBuffer([]byte{})
pubbuf := bytes.NewBuffer([]byte{})
// 生成私钥文件
privateKey, err := rsa.GenerateKey(rand.Reader, bits)
if err != nil {
return nil, nil
}
derPrivateStream := x509.MarshalPKCS1PrivateKey(privateKey)
block := &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: derPrivateStream,
}
err = pem.Encode(pribuf, block)
if err != nil {
return nil, nil
}
// 生成公钥文件
publicKey := &privateKey.PublicKey
derPkix := x509.MarshalPKCS1PublicKey(publicKey)
block = &pem.Block{
Type: "RSA PUBLIC KEY",
Bytes: derPkix,
}
err = pem.Encode(pubbuf, block)
if err != nil {
return nil, nil
}
return pubbuf.Bytes(), pribuf.Bytes()
}