cryptil.go 2.0 KB

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