sensitive.dart 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /// 脱敏函数集合
  2. abstract class SensitiveUtils {
  3. // /// 身份证号
  4. // ///
  5. // /// 显示前六位和后四位
  6. // ///
  7. // /// - 如:123456********0011
  8. // static String desensitizeIdCard(String zjhm) {
  9. // if (zjhm.isEmpty) {
  10. // return "";
  11. // }
  12. // int encLength = zjhm.length - 10;
  13. // String regex = "(\\d{6})\\d{$encLength}(\\w{4})";
  14. // return zjhm.replaceAll(RegExp(regex), "\$1********\$2");
  15. // }
  16. /// 身份证号
  17. ///
  18. /// 前六位,后四位,其他用星号隐藏每位1个星号
  19. ///
  20. /// - 如:123456*********0011
  21. static String desensitizeIdCard(String zjhm) {
  22. if (zjhm.isEmpty) {
  23. return "";
  24. }
  25. StringBuffer sb = StringBuffer();
  26. sb.write(zjhm.substring(0, 6));
  27. for (int i = 0; i < zjhm.length - 10; i++) {
  28. sb.write("*");
  29. }
  30. sb.write(zjhm.substring(zjhm.length - 4));
  31. return sb.toString();
  32. }
  33. /// 身份证号
  34. ///
  35. /// 显示最后四位,其他隐藏
  36. ///
  37. /// 共计18位或者15位
  38. ///
  39. /// - 如:*************5762
  40. static String desensitizeIdCardNum(String zjhm) {
  41. if (zjhm.isEmpty) {
  42. return "";
  43. }
  44. StringBuffer sb = StringBuffer();
  45. for (int i = 0; i < zjhm.length - 4; i++) {
  46. sb.write("*");
  47. }
  48. sb.write(zjhm.substring(zjhm.length - 4));
  49. return sb.toString();
  50. }
  51. /// 中文名
  52. ///
  53. /// 如果长度=2,后一位隐藏为星号
  54. ///
  55. /// - 如: 张*
  56. ///
  57. /// 如果长度>2,中间隐藏为星号
  58. ///
  59. /// - 如:张*锤
  60. static String desensitizeChineseName(String fullName) {
  61. if (fullName.isEmpty) {
  62. return "";
  63. }
  64. StringBuffer sb = StringBuffer();
  65. sb.write(fullName.substring(0, 1));
  66. for (int i = 0; i < fullName.length - 2; i++) {
  67. sb.write("*");
  68. }
  69. if (fullName.length > 2) {
  70. sb.write(fullName.substring(fullName.length - 1));
  71. } else {
  72. sb.write("*");
  73. }
  74. return sb.toString();
  75. }
  76. /// 固定电话
  77. ///
  78. /// 显示后四位,其他隐藏
  79. ///
  80. /// - 如 : ****1234
  81. static String desensitizeFixedPhone(String num) {
  82. if (num.isEmpty) {
  83. return "";
  84. }
  85. StringBuffer sb = StringBuffer();
  86. for (int i = 0; i < num.length - 4; i++) {
  87. sb.write("*");
  88. }
  89. sb.write(num.substring(num.length - 4));
  90. return sb.toString();
  91. }
  92. /// 手机号
  93. ///
  94. /// 前三位,后两位,其他隐藏
  95. ///
  96. /// - 如:138********34
  97. static String desensitizeMobilePhone(String num) {
  98. if (num.isEmpty) {
  99. return "";
  100. }
  101. StringBuffer sb = StringBuffer();
  102. sb.write(num.substring(0, 3));
  103. for (int i = 0; i < num.length - 5; i++) {
  104. sb.write("*");
  105. }
  106. sb.write(num.substring(num.length - 2));
  107. return sb.toString();
  108. }
  109. /// 地址
  110. ///
  111. /// 只显示到地区,不显示详细地址
  112. static String desensitizeAddress(String address) {
  113. if (address.isEmpty) {
  114. return "";
  115. }
  116. const areaKeys = ["县", "区", "市", "省", "自治州"];
  117. int publicPartTail = 0;
  118. for (int i = 0; i < areaKeys.length; i++) {
  119. final key = areaKeys[i];
  120. final index = address.indexOf(key);
  121. if (index > -1) {
  122. publicPartTail = index;
  123. if (key == "市") {
  124. // 县级市
  125. final subCityIndex = address.substring(index + 1).indexOf("市");
  126. if (subCityIndex > -1 && subCityIndex < 6) {
  127. publicPartTail = (index + 1) + subCityIndex;
  128. }
  129. }
  130. break;
  131. }
  132. }
  133. if (publicPartTail < 1) {
  134. publicPartTail = 8; // 找不到区域范围,只显示前8个字符
  135. }
  136. final publicPartString = address.substring(0, publicPartTail + 1);
  137. final desensitizedString =
  138. List<String>.filled(address.length - publicPartTail, "*").join();
  139. return "$publicPartString$desensitizedString";
  140. }
  141. // /// 地址
  142. // ///
  143. // /// 只显示到地区,不显示详细地址(我们要对个人信息增强保护)
  144. // ///
  145. // /// - 如:北京市海淀区****
  146. // ///
  147. // /// [sensitiveSize] 敏感信息长度
  148. // static String desensitizeAddress(String address, int sensitiveSize) {
  149. // if (address.isEmpty) {
  150. // return "";
  151. // }
  152. // StringBuffer sb = StringBuffer();
  153. // for (int i = 0; i < address.length - sensitiveSize; i++) {
  154. // sb.write("*");
  155. // }
  156. // sb.write(address.substring(address.length - sensitiveSize));
  157. // return sb.toString();
  158. // }
  159. /// 电子邮箱
  160. ///
  161. /// 前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示
  162. ///
  163. /// - 如:g**@163.com
  164. static String desensitizeEmail(String email) {
  165. if (email.isEmpty) {
  166. return "";
  167. }
  168. int index = email.indexOf("@");
  169. String end = email.substring(index);
  170. StringBuffer sb = StringBuffer();
  171. sb.write(email.substring(0, 1));
  172. for (int i = 0; i < email.length - end.length - 1; i++) {
  173. sb.write("*");
  174. }
  175. sb.write(end);
  176. return sb.toString();
  177. }
  178. /// 银行卡
  179. ///
  180. /// 前六位,后四位,其他用星号隐藏每位1个星号
  181. ///
  182. /// - 如:6222600**********1234
  183. static String desensitizeBankCard(String cardNum) {
  184. if (cardNum.isEmpty) {
  185. return "";
  186. }
  187. StringBuffer sb = StringBuffer();
  188. sb.write(cardNum.substring(0, 6));
  189. for (int i = 0; i < cardNum.length - 10; i++) {
  190. sb.write("*");
  191. }
  192. sb.write(cardNum.substring(cardNum.length - 4));
  193. return sb.toString();
  194. }
  195. /// 公司开户银行联行号
  196. ///
  197. /// 显示前两位,其他用星号隐藏,每位1个星号
  198. ///
  199. /// - 如:12********
  200. static String desensitizeCnapsCode(String code) {
  201. if (code.isEmpty) {
  202. return "";
  203. }
  204. StringBuffer sb = StringBuffer();
  205. sb.write(code.substring(0, 2));
  206. for (int i = 0; i < code.length - 2; i++) {
  207. sb.write("*");
  208. }
  209. return sb.toString();
  210. }
  211. }