buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

终于有了,史上最强大的数据脱敏处理算法

哈哈,标题党了,向你道歉!

言归正传。

我们的应用系统里,为保护用户隐私,用户的敏感信息经常要做脱敏显示或脱敏存储,比如用户的身份证号、手机号、银行卡,等等。在支付系统或金融系统,数据安全是第一要务,数据的脱敏处理更是必选项。

【身份证号脱敏示例】110115201406180712 脱敏后:110115********0712
【银行卡号脱敏示例】9558820200019833888 脱敏后:955882*********3888
【手机号脱敏示例】18810754438 脱敏后:188******38

 

算法实现原理很简单,就是保留头尾字符,把中间的部分用特殊字符如星号“*”作为掩码来表示。

网上类似算法很多。这里提供一个可供参考:

import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;
    public static String maskSensitiveData(String str, int headCharCount, int tailCharCount) {
        if(str.length()<headCharCount+tailCharCount){
            throw new IllegalArgumentException("明文过短,无法脱敏");
        }
        String repeat = "";

        int len = str.length() - headCharCount - tailCharCount;
        if (len > 0) {
            char[] buf = new char[len];
            AtomicInteger integer = new AtomicInteger(0);
            Arrays.asList(new Integer[len]).stream().forEach(b -> buf[integer.getAndIncrement()] = '*');
            repeat = new String(buf);
        }
        return str.substring(0, headCharCount) + repeat + str.substring(str.length() - tailCharCount);
    }

 

测试案例:

    public static void main(String[] args) {
        System.out.println(maskSensitiveData("120115201406180712", 6, 4));
        System.out.println(maskSensitiveData("9558820200019833888", 6, 4));
        System.out.println(maskSensitiveData("18810754438", 3, 2));
    }

结果输出:

120115********0712
955882*********3888
188******38

 

 

参考:什么是数据脱敏(Data Masking)

隐私 单词翻译为:privacy。

敏感的:sensitive。我们经常见到的有caseSensitive(是否区分大小写)

根据系统程序需要,可以封装一个数据脱敏工具类:PrivacyUtil,包括的方法可以有maskIdCardNo、maskEmail、maskMobile、maskUserName等等。

posted on 2019-11-25 21:10  buguge  阅读(8893)  评论(2编辑  收藏  举报