index.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package desensitized
  2. import (
  3. "bytes"
  4. "regexp"
  5. "strings"
  6. )
  7. type Desensitized struct {
  8. }
  9. // DefaultDesensitized 默认:匹配 手机号,邮箱,中文,身份证 等进行脱敏处理
  10. func (d Desensitized) DefaultDesensitized(str string) (result string) {
  11. var buffer bytes.Buffer
  12. if str == "" {
  13. return "***"
  14. }
  15. if strings.Contains(str, "@") {
  16. // 邮箱
  17. res := strings.Split(str, "@")
  18. if len(res[0]) < 3 {
  19. resString := "***"
  20. buffer.WriteString(resString)
  21. buffer.WriteString("@")
  22. buffer.WriteString(res[1])
  23. result = buffer.String()
  24. } else {
  25. res2 := d.subStr(str, 0, 3)
  26. resString := res2 + "***"
  27. buffer.WriteString(resString)
  28. buffer.WriteString("@")
  29. buffer.WriteString(res[1])
  30. result = buffer.String()
  31. }
  32. return result
  33. } else {
  34. reg := `^1[0-9]\d{9}$`
  35. rgx := regexp.MustCompile(reg)
  36. mobileMatch := rgx.MatchString(str)
  37. if mobileMatch {
  38. // 手机号
  39. buffer.WriteString(d.subStr(str, 0, 3))
  40. buffer.WriteString("****")
  41. buffer.WriteString(d.subStr(str, 7, 11))
  42. result = buffer.String()
  43. } else {
  44. nameRune := []rune(str)
  45. lens := len(nameRune)
  46. if lens <= 1 {
  47. result = "***"
  48. } else if lens == 2 {
  49. buffer.WriteString(string(nameRune[:1]))
  50. buffer.WriteString("*")
  51. result = buffer.String()
  52. } else if lens == 3 {
  53. buffer.WriteString(string(nameRune[:1]))
  54. buffer.WriteString("*")
  55. buffer.WriteString(string(nameRune[2:3]))
  56. result = buffer.String()
  57. } else if lens == 4 {
  58. buffer.WriteString(string(nameRune[:1]))
  59. buffer.WriteString("**")
  60. buffer.WriteString(string(nameRune[lens-1 : lens]))
  61. result = buffer.String()
  62. } else if lens == 18 {
  63. buffer.WriteString(string(nameRune[:4]))
  64. buffer.WriteString("**********")
  65. buffer.WriteString(string(nameRune[lens-4 : lens]))
  66. result = buffer.String()
  67. } else {
  68. i := lens / 3
  69. buffer.WriteString(string(nameRune[:i]))
  70. buffer.WriteString(strings.Repeat("*", i))
  71. buffer.WriteString(d.subStr(str, i*2, len(str)))
  72. result = buffer.String()
  73. }
  74. }
  75. return
  76. }
  77. }
  78. // CustomizeHash 自定义机密部分
  79. func (Desensitized) subStr(str string, start int, end int) string {
  80. rs := []rune(str)
  81. return string(rs[start:end])
  82. }
  83. // CustomizeHash @param 需要脱敏的字符串
  84. //@param start 需要隐藏开始的位置
  85. //@param end 需要隐藏结束的位置
  86. //自定义脱敏方法
  87. func (d Desensitized) CustomizeHash(str string, start int, end int) string {
  88. return d.subStr(str, 0, start) + strings.Repeat("*", end-start) + d.subStr(str, end, len(str))
  89. }