cryptil.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package cryptil
  2. import (
  3. "crypto/hmac"
  4. "crypto/md5"
  5. "crypto/sha1"
  6. "encoding/base64"
  7. "fmt"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "io"
  12. "crypto/rand"
  13. )
  14. var stdChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
  15. //对称加密与解密之加密【从Beego中提取出来的】
  16. //@param value 需要加密的字符串
  17. //@param secret 加密密钥
  18. //@return encrypt 返回的加密后的字符串
  19. func Encrypt(value, secret string) (encrypt string) {
  20. vs := base64.URLEncoding.EncodeToString([]byte(value))
  21. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  22. h := hmac.New(sha1.New, []byte(secret))
  23. fmt.Fprintf(h, "%s%s", vs, timestamp)
  24. sig := fmt.Sprintf("%02x", h.Sum(nil))
  25. return strings.Join([]string{vs, timestamp, sig}, ".")
  26. }
  27. //对称加密与解密之解密【从Beego中提取出来的】
  28. //@param value 需要解密的字符串
  29. //@param secret 密钥
  30. //@return decrypt 返回解密后的字符串
  31. func Decrypt(value, secret string) (decrypt string) {
  32. parts := strings.SplitN(value, ".", 3)
  33. if len(parts) != 3 {
  34. return ""
  35. }
  36. vs := parts[0]
  37. timestamp := parts[1]
  38. sig := parts[2]
  39. h := hmac.New(sha1.New, []byte(secret))
  40. fmt.Fprintf(h, "%s%s", vs, timestamp)
  41. if fmt.Sprintf("%02x", h.Sum(nil)) != sig {
  42. return ""
  43. }
  44. res, _ := base64.URLEncoding.DecodeString(vs)
  45. return string(res)
  46. }
  47. //MD5加密
  48. //@param str 需要加密的字符串
  49. //@param salt 盐值
  50. //@return CryptStr 加密后返回的字符串
  51. func Md5Crypt(str string, salt ...interface{}) (CryptStr string) {
  52. if l := len(salt); l > 0 {
  53. slice := make([]string, l+1)
  54. str = fmt.Sprintf(str+strings.Join(slice, "%v"), salt...)
  55. }
  56. return fmt.Sprintf("%x", md5.Sum([]byte(str)))
  57. }
  58. //SHA1加密
  59. //@param str 需要加密的字符串
  60. //@param salt 盐值
  61. //@return CryptStr 加密后返回的字符串
  62. func Sha1Crypt(str string, salt ...interface{}) (CryptStr string) {
  63. if l := len(salt); l > 0 {
  64. slice := make([]string, l+1)
  65. str = fmt.Sprintf(str+strings.Join(slice, "%v"), salt...)
  66. }
  67. return fmt.Sprintf("%x", sha1.Sum([]byte(str)))
  68. }
  69. //生成Guid字串
  70. func UniqueId() string {
  71. b := make([]byte, 48)
  72. if _, err := io.ReadFull(rand.Reader, b); err != nil {
  73. return ""
  74. }
  75. return Md5Crypt(base64.URLEncoding.EncodeToString(b))
  76. }
  77. //生成指定长度的字符串.
  78. func NewRandChars(length int) string {
  79. if length == 0 {
  80. return ""
  81. }
  82. clen := len(stdChars)
  83. if clen < 2 || clen > 256 {
  84. panic("Wrong charset length for NewLenChars()")
  85. }
  86. maxrb := 255 - (256 % clen)
  87. b := make([]byte, length)
  88. r := make([]byte, length+(length/4)) // storage for random bytes.
  89. i := 0
  90. for {
  91. if _, err := rand.Read(r); err != nil {
  92. panic("Error reading random bytes: " + err.Error())
  93. }
  94. for _, rb := range r {
  95. c := int(rb)
  96. if c > maxrb {
  97. continue // Skip this number to avoid modulo bias.
  98. }
  99. b[i] = stdChars[c%clen]
  100. i++
  101. if i == length {
  102. return string(b)
  103. }
  104. }
  105. }
  106. }