123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- /// 脱敏函数集合
- abstract class SensitiveUtils {
- // /// 身份证号
- // ///
- // /// 显示前六位和后四位
- // ///
- // /// - 如:123456********0011
- // static String desensitizeIdCard(String zjhm) {
- // if (zjhm.isEmpty) {
- // return "";
- // }
- // int encLength = zjhm.length - 10;
- // String regex = "(\\d{6})\\d{$encLength}(\\w{4})";
- // return zjhm.replaceAll(RegExp(regex), "\$1********\$2");
- // }
- /// 身份证号
- ///
- /// 前六位,后四位,其他用星号隐藏每位1个星号
- ///
- /// - 如:123456*********0011
- static String desensitizeIdCard(String zjhm) {
- if (zjhm.isEmpty) {
- return "";
- }
- StringBuffer sb = StringBuffer();
- sb.write(zjhm.substring(0, 6));
- for (int i = 0; i < zjhm.length - 10; i++) {
- sb.write("*");
- }
- sb.write(zjhm.substring(zjhm.length - 4));
- return sb.toString();
- }
- /// 身份证号
- ///
- /// 显示最后四位,其他隐藏
- ///
- /// 共计18位或者15位
- ///
- /// - 如:*************5762
- static String desensitizeIdCardNum(String zjhm) {
- if (zjhm.isEmpty) {
- return "";
- }
- StringBuffer sb = StringBuffer();
- for (int i = 0; i < zjhm.length - 4; i++) {
- sb.write("*");
- }
- sb.write(zjhm.substring(zjhm.length - 4));
- return sb.toString();
- }
- /// 中文名
- ///
- /// 如果长度=2,后一位隐藏为星号
- ///
- /// - 如: 张*
- ///
- /// 如果长度>2,中间隐藏为星号
- ///
- /// - 如:张*锤
- static String desensitizeChineseName(String fullName) {
- if (fullName.isEmpty) {
- return "";
- }
- StringBuffer sb = StringBuffer();
- sb.write(fullName.substring(0, 1));
- for (int i = 0; i < fullName.length - 2; i++) {
- sb.write("*");
- }
- if (fullName.length > 2) {
- sb.write(fullName.substring(fullName.length - 1));
- } else {
- sb.write("*");
- }
- return sb.toString();
- }
- /// 固定电话
- ///
- /// 显示后四位,其他隐藏
- ///
- /// - 如 : ****1234
- static String desensitizeFixedPhone(String num) {
- if (num.isEmpty) {
- return "";
- }
- StringBuffer sb = StringBuffer();
- for (int i = 0; i < num.length - 4; i++) {
- sb.write("*");
- }
- sb.write(num.substring(num.length - 4));
- return sb.toString();
- }
- /// 手机号
- ///
- /// 前三位,后两位,其他隐藏
- ///
- /// - 如:138********34
- static String desensitizeMobilePhone(String num) {
- if (num.isEmpty) {
- return "";
- }
- StringBuffer sb = StringBuffer();
- sb.write(num.substring(0, 3));
- for (int i = 0; i < num.length - 5; i++) {
- sb.write("*");
- }
- sb.write(num.substring(num.length - 2));
- return sb.toString();
- }
- /// 地址
- ///
- /// 只显示到地区,不显示详细地址
- static String desensitizeAddress(String address) {
- if (address.isEmpty) {
- return "";
- }
- const areaKeys = ["县", "区", "市", "省", "自治州"];
- int publicPartTail = 0;
- for (int i = 0; i < areaKeys.length; i++) {
- final key = areaKeys[i];
- final index = address.indexOf(key);
- if (index > -1) {
- publicPartTail = index;
- if (key == "市") {
- // 县级市
- final subCityIndex = address.substring(index + 1).indexOf("市");
- if (subCityIndex > -1 && subCityIndex < 6) {
- publicPartTail = (index + 1) + subCityIndex;
- }
- }
- break;
- }
- }
- if (publicPartTail < 1) {
- publicPartTail = 8; // 找不到区域范围,只显示前8个字符
- }
- final publicPartString = address.substring(0, publicPartTail + 1);
- final desensitizedString =
- List<String>.filled(address.length - publicPartTail, "*").join();
- return "$publicPartString$desensitizedString";
- }
- // /// 地址
- // ///
- // /// 只显示到地区,不显示详细地址(我们要对个人信息增强保护)
- // ///
- // /// - 如:北京市海淀区****
- // ///
- // /// [sensitiveSize] 敏感信息长度
- // static String desensitizeAddress(String address, int sensitiveSize) {
- // if (address.isEmpty) {
- // return "";
- // }
- // StringBuffer sb = StringBuffer();
- // for (int i = 0; i < address.length - sensitiveSize; i++) {
- // sb.write("*");
- // }
- // sb.write(address.substring(address.length - sensitiveSize));
- // return sb.toString();
- // }
- /// 电子邮箱
- ///
- /// 前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示
- ///
- /// - 如:g**@163.com
- static String desensitizeEmail(String email) {
- if (email.isEmpty) {
- return "";
- }
- int index = email.indexOf("@");
- String end = email.substring(index);
- StringBuffer sb = StringBuffer();
- sb.write(email.substring(0, 1));
- for (int i = 0; i < email.length - end.length - 1; i++) {
- sb.write("*");
- }
- sb.write(end);
- return sb.toString();
- }
- /// 银行卡
- ///
- /// 前六位,后四位,其他用星号隐藏每位1个星号
- ///
- /// - 如:6222600**********1234
- static String desensitizeBankCard(String cardNum) {
- if (cardNum.isEmpty) {
- return "";
- }
- StringBuffer sb = StringBuffer();
- sb.write(cardNum.substring(0, 6));
- for (int i = 0; i < cardNum.length - 10; i++) {
- sb.write("*");
- }
- sb.write(cardNum.substring(cardNum.length - 4));
- return sb.toString();
- }
- /// 公司开户银行联行号
- ///
- /// 显示前两位,其他用星号隐藏,每位1个星号
- ///
- /// - 如:12********
- static String desensitizeCnapsCode(String code) {
- if (code.isEmpty) {
- return "";
- }
- StringBuffer sb = StringBuffer();
- sb.write(code.substring(0, 2));
- for (int i = 0; i < code.length - 2; i++) {
- sb.write("*");
- }
- return sb.toString();
- }
- }
|