stringtool.go 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package utils
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "crypto/md5"
  7. "encoding/base64"
  8. "fmt"
  9. "math/rand"
  10. "strconv"
  11. "strings"
  12. "time"
  13. "github.com/astaxie/beego"
  14. "golang.org/x/crypto/bcrypt"
  15. )
  16. // 将字符串加密成 md5
  17. func String2md5(str string) string {
  18. data := []byte(str)
  19. has := md5.Sum(data)
  20. return fmt.Sprintf("%x", has) //将[]byte转成16进制
  21. }
  22. // RandomString 在数字、大写字母、小写字母范围内生成num位的随机字符串
  23. func RandomString(length int) string {
  24. // 48 ~ 57 数字
  25. // 65 ~ 90 A ~ Z
  26. // 97 ~ 122 a ~ z
  27. // 一共62个字符,在0~61进行随机,小于10时,在数字范围随机,
  28. // 小于36在大写范围内随机,其他在小写范围随机
  29. rand.Seed(time.Now().UnixNano())
  30. result := make([]string, 0, length)
  31. for i := 0; i < length; i++ {
  32. t := rand.Intn(62)
  33. if t < 10 {
  34. result = append(result, strconv.Itoa(rand.Intn(10)))
  35. } else if t < 36 {
  36. result = append(result, string(rand.Intn(26)+65))
  37. } else {
  38. result = append(result, string(rand.Intn(26)+97))
  39. }
  40. }
  41. return strings.Join(result, "")
  42. }
  43. func RandomNumberString(length int) string {
  44. var str string
  45. for i := 0; i < length; i++ {
  46. rand.Seed(time.Now().UnixNano())
  47. str += strconv.Itoa(rand.Intn(10))
  48. }
  49. return str
  50. }
  51. // AES加密
  52. func AESEncrypt(origin string) string {
  53. aes_key := beego.AppConfig.String("aes_key")
  54. fmt.Println(aes_key)
  55. xpass, _ := _aesEncrypt([]byte(origin), []byte(aes_key))
  56. fmt.Println(_aesEncrypt([]byte(origin), []byte(aes_key)))
  57. fmt.Println(xpass)
  58. pass64 := base64.StdEncoding.EncodeToString(xpass)
  59. fmt.Println(pass64)
  60. return pass64
  61. }
  62. func AESDecrypt(crypted []byte) string {
  63. aes_key := beego.AppConfig.String("aes_key")
  64. origData, err := _aesDecrypt(crypted, []byte(aes_key))
  65. if err != nil {
  66. return ""
  67. }
  68. return string(origData)
  69. }
  70. func _PKCS5Padding(ciphertext []byte, blockSize int) []byte {
  71. padding := blockSize - len(ciphertext)%blockSize
  72. padtext := bytes.Repeat([]byte{byte(padding)}, padding)
  73. return append(ciphertext, padtext...)
  74. }
  75. func _PKCS5UnPadding(origData []byte) []byte {
  76. length := len(origData)
  77. unpadding := int(origData[length-1])
  78. return origData[:(length - unpadding)]
  79. }
  80. func _aesEncrypt(origData, key []byte) ([]byte, error) {
  81. block, err := aes.NewCipher(key)
  82. if err != nil {
  83. return nil, err
  84. }
  85. blockSize := block.BlockSize()
  86. origData = _PKCS5Padding(origData, blockSize)
  87. blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
  88. crypted := make([]byte, len(origData))
  89. blockMode.CryptBlocks(crypted, origData)
  90. return crypted, nil
  91. }
  92. func _aesDecrypt(crypted, key []byte) ([]byte, error) {
  93. block, err := aes.NewCipher(key)
  94. if err != nil {
  95. return nil, err
  96. }
  97. blockSize := block.BlockSize()
  98. blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
  99. origData := make([]byte, len(crypted))
  100. blockMode.CryptBlocks(origData, crypted)
  101. origData = _PKCS5UnPadding(origData)
  102. return origData, nil
  103. }
  104. func PasswordHash(password string) (string, error) {
  105. bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
  106. return string(bytes), err
  107. }
  108. // PasswordVerify php的函数password_verify
  109. func PasswordVerify(password, hash string) bool {
  110. err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
  111. return err == nil
  112. }