123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- 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
- }
|