cryptil.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. //对称加密与解密之加密【从Beego中提取出来的】
  15. //@param value 需要加密的字符串
  16. //@param secret 加密密钥
  17. //@return encrypt 返回的加密后的字符串
  18. func Encrypt(value, secret string) (encrypt string) {
  19. vs := base64.URLEncoding.EncodeToString([]byte(value))
  20. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  21. h := hmac.New(sha1.New, []byte(secret))
  22. fmt.Fprintf(h, "%s%s", vs, timestamp)
  23. sig := fmt.Sprintf("%02x", h.Sum(nil))
  24. return strings.Join([]string{vs, timestamp, sig}, ".")
  25. }
  26. //对称加密与解密之解密【从Beego中提取出来的】
  27. //@param value 需要解密的字符串
  28. //@param secret 密钥
  29. //@return decrypt 返回解密后的字符串
  30. func Decrypt(value, secret string) (decrypt string) {
  31. parts := strings.SplitN(value, ".", 3)
  32. if len(parts) != 3 {
  33. return ""
  34. }
  35. vs := parts[0]
  36. timestamp := parts[1]
  37. sig := parts[2]
  38. h := hmac.New(sha1.New, []byte(secret))
  39. fmt.Fprintf(h, "%s%s", vs, timestamp)
  40. if fmt.Sprintf("%02x", h.Sum(nil)) != sig {
  41. return ""
  42. }
  43. res, _ := base64.URLEncoding.DecodeString(vs)
  44. return string(res)
  45. }
  46. //MD5加密
  47. //@param str 需要加密的字符串
  48. //@param salt 盐值
  49. //@return CryptStr 加密后返回的字符串
  50. func Md5Crypt(str string, salt ...interface{}) (CryptStr string) {
  51. if l := len(salt); l > 0 {
  52. slice := make([]string, l+1)
  53. str = fmt.Sprintf(str+strings.Join(slice, "%v"), salt...)
  54. }
  55. return fmt.Sprintf("%x", md5.Sum([]byte(str)))
  56. }
  57. //SHA1加密
  58. //@param str 需要加密的字符串
  59. //@param salt 盐值
  60. //@return CryptStr 加密后返回的字符串
  61. func Sha1Crypt(str string, salt ...interface{}) (CryptStr string) {
  62. if l := len(salt); l > 0 {
  63. slice := make([]string, l+1)
  64. str = fmt.Sprintf(str+strings.Join(slice, "%v"), salt...)
  65. }
  66. return fmt.Sprintf("%x", sha1.Sum([]byte(str)))
  67. }
  68. //生成Guid字串
  69. func UniqueId() string {
  70. b := make([]byte, 48)
  71. if _, err := io.ReadFull(rand.Reader, b); err != nil {
  72. return ""
  73. }
  74. return Md5Crypt(base64.URLEncoding.EncodeToString(b))
  75. }