Files
GoFilm/server/plugin/common/util/StringUtil.go
2023-12-23 22:32:52 +08:00

127 lines
3.1 KiB
Go

package util
import (
"crypto/md5"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/hex"
"encoding/pem"
"errors"
"fmt"
"log"
"net/url"
"regexp"
)
// GenerateUUID 生成UUID
func GenerateUUID() (uuid string) {
b := make([]byte, 16)
_, err := rand.Read(b)
if err != nil {
log.Fatal(err)
}
uuid = fmt.Sprintf("%X-%X-%X-%X-%X",
b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
return
}
// RandomString 生成指定长度两倍的随机字符串
func RandomString(length int) (uuid string) {
b := make([]byte, length)
_, err := rand.Read(b)
if err != nil {
log.Fatal(err)
}
uuid = fmt.Sprintf("%x", b)
return
}
// GenerateSalt 生成 length为16的随机字符串
func GenerateSalt() (uuid string) {
b := make([]byte, 8)
_, err := rand.Read(b)
if err != nil {
log.Fatal(err)
}
uuid = fmt.Sprintf("%X", b)
return
}
// PasswordEncrypt 密码加密 , (password+salt) md5 * 3
func PasswordEncrypt(password, salt string) string {
b := []byte(fmt.Sprint(password, salt)) // 将字符串转换为字节切片
var r [16]byte
for i := 0; i < 3; i++ {
r = md5.Sum(b) // 调用md5.Sum()函数进行加密
b = []byte(hex.EncodeToString(r[:]))
}
return hex.EncodeToString(r[:])
}
// ParsePriKeyBytes 解析私钥
func ParsePriKeyBytes(buf []byte) (*rsa.PrivateKey, error) {
p := &pem.Block{}
p, buf = pem.Decode(buf)
if p == nil {
return nil, errors.New("private key parse error")
}
return x509.ParsePKCS1PrivateKey(p.Bytes)
}
// ParsePubKeyBytes 解析公钥
func ParsePubKeyBytes(buf []byte) (*rsa.PublicKey, error) {
p, _ := pem.Decode(buf)
if p == nil {
return nil, errors.New("parse publicKey content nil")
}
pubKey, err := x509.ParsePKCS1PublicKey(p.Bytes)
if err != nil {
return nil, errors.New("x509.ParsePKCS1PublicKey error")
}
return pubKey, nil
}
// ValidDomain 域名校验(http://example.xxx)
func ValidDomain(s string) bool {
return regexp.MustCompile(`^(http|https)://[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*\.[a-z]{2,6}(:[0-9]{1,5})?$`).MatchString(s)
}
// ValidIPHost 校验是否符合http|https//ip 格式
func ValidIPHost(s string) bool {
return regexp.MustCompile(`^(http|https)://(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(:[0-9]{1,5})?$`).MatchString(s)
}
// ValidURL 校验http链接是否是符合规范的URL
func ValidURL(s string) bool {
_, err := url.ParseRequestURI(s)
if err != nil {
return false
}
return true
}
func ValidPwd(s string) error {
if len(s) < 8 || len(s) > 12 {
return fmt.Errorf("密码长度不符合规范, 必须为8-10位")
}
// 分别校验数字 大小写字母和特殊字符
num := `[0-9]{1}`
l := `[a-z]{1}`
u := `[A-Z]{1}`
symbol := `[!@#~$%^&*()+|_]{1}`
if b, err := regexp.MatchString(num, s); !b || err != nil {
return errors.New("密码必须包含数字 ")
}
if b, err := regexp.MatchString(l, s); !b || err != nil {
return errors.New("密码必须包含小写字母")
}
if b, err := regexp.MatchString(u, s); !b || err != nil {
return errors.New("密码必须包含大写字母")
}
if b, err := regexp.MatchString(symbol, s); !b || err != nil {
return errors.New("密码必须包含特殊字")
}
return nil
}