package utils import ( "bytes" "crypto/aes" "crypto/cipher" "crypto/md5" "encoding/base64" "fmt" "math/rand" "strconv" "strings" "time" "github.com/astaxie/beego" ) // 将字符串加密成 md5 func String2md5(str string) string { data := []byte(str) has := md5.Sum(data) return fmt.Sprintf("%x", has) //将[]byte转成16进制 } // RandomString 在数字、大写字母、小写字母范围内生成num位的随机字符串 func RandomString(length int) string { // 48 ~ 57 数字 // 65 ~ 90 A ~ Z // 97 ~ 122 a ~ z // 一共62个字符,在0~61进行随机,小于10时,在数字范围随机, // 小于36在大写范围内随机,其他在小写范围随机 rand.Seed(time.Now().UnixNano()) result := make([]string, 0, length) for i := 0; i < length; i++ { t := rand.Intn(62) if t < 10 { result = append(result, strconv.Itoa(rand.Intn(10))) } else if t < 36 { result = append(result, string(rand.Intn(26)+65)) } else { result = append(result, string(rand.Intn(26)+97)) } } return strings.Join(result, "") } // AES加密 func AESEncrypt(origin string) string { aes_key := beego.AppConfig.String("aes_key") xpass, _ := _aesEncrypt([]byte(origin), []byte(aes_key)) pass64 := base64.StdEncoding.EncodeToString(xpass) return pass64 } func AESDecrypt(crypted []byte) string { aes_key := beego.AppConfig.String("aes_key") origData, err := _aesDecrypt(crypted, []byte(aes_key)) if err != nil { return "" } return string(origData) } 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(origData []byte) []byte { length := len(origData) unpadding := int(origData[length-1]) return origData[:(length - unpadding)] } func _aesEncrypt(origData, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockSize := block.BlockSize() origData = _PKCS5Padding(origData, blockSize) blockMode := cipher.NewCBCEncrypter(block, key[:blockSize]) crypted := make([]byte, len(origData)) blockMode.CryptBlocks(crypted, origData) return crypted, nil } func _aesDecrypt(crypted, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockSize := block.BlockSize() blockMode := cipher.NewCBCDecrypter(block, key[:blockSize]) origData := make([]byte, len(crypted)) blockMode.CryptBlocks(origData, crypted) origData = _PKCS5UnPadding(origData) return origData, nil }