개발이야기/Java

[Java] 개인정보 마스킹 처리하기 (이름, 휴대번호, 이메일, 계좌번호, 은행)

후린개발자 2023. 11. 13.
반응형

아래 소스코드는 주어진 문자열을 특정 유형에 따라 마스킹(일부 또는 전체 문자를 숨김 처리)하는 메서드와 이를 활용하는 메인 메서드로 이루어져 있습니다.

 

 

마스킹 규칙

Name (이름)
-길이가 2인 경우: 첫 번째 문자를 '*'로 대체합니다.
-길이가 3인 경우: 두 번째 문자를 '*'로 대체합니다.
-길이가 4 이상인 경우: 가운데 두 문자를 '*'로 대체합니다.

 


Mobile (휴대폰 번호)
-길이가 8에서 10 사이인 경우: 앞부분 4자리는 그대로 두고 나머지를 '*'로 대체합니다.
-길이가 11 이상인 경우: 앞부분 5자리는 그대로 두고 뒤에 4자리를 '*'로 대체합니다.

 


Email (이메일 주소)
-길이가 1 또는 2인 경우: '@' 이전의 문자를 '*'로 대체합니다.
-길이가 3 또는 4인 경우: '@' 이전의 두 번째 문자를 '*'로 대체합니다.
-길이가 5 이상인 경우: '@' 이전의 세 번째 이후의 문자를 '***'로 대체합니다.

 


Address (주소)
-문자열의 모든 문자 중 공백을 제외한 문자를 '*'로 대체합니다.

 


BankName (은행 이름)
길이가 2 이상인 경우: 앞부분 2자리를 '*'로 대체합니다.
길이가 2 미만인 경우: '**'로 대체합니다.

 


AccountNumber (계좌 번호)
-길이가 7 이상인 경우: 앞부분 6자리는 그대로 두고 나머지를 '*'로 대체합니다.

 


Year (연도)
-모든 문자를 '*'로 대체합니다.

 


Month (월)
-모든 문자를 '*'로 대체합니다.

 

 

import org.apache.commons.lang.StringUtils;

public class TT {
    public enum MaskingType {
        Name,
        Mobile,
        Email,
        Address,
        BankName,
        AccountNumber,
        Year,
        Month
    }
    public static String maskAs(String value, MaskingType maskingType ) {
        if (StringUtils.isEmpty(value) || value.trim().length() == 0) return value;
        
        String maskingValue = value;
        switch (maskingType) {
            case Name:
                if (value.length() == 2)
                    maskingValue = "*"+value.substring(1);
                else if (value.length() == 3)
                    maskingValue = value.substring(0,1)+"*"+value.substring(2);
                else if (value.length() >= 4)
                    maskingValue = value.substring(0,1)+"**"+value.substring(3);
                break;
            case Mobile:
                if (value.length() >= 8 && value.length() <= 10)
                    maskingValue = (value.length() == 8) ? value.substring(0,4)+"****" : value.substring(0,4)+"****"+value.substring(8);
                else if (value.length() >= 11)
                    maskingValue = value.substring(0,5)+"****"+value.substring(9);
                // what about length 1 to 7 
                break;
            case Email:
                if (!value.substring(0).equals("@") && value.contains("@")){
                    String emailValue = value.split("@")[0];
                    if (emailValue.length() == 1 || emailValue.length() == 2)
                        maskingValue = (emailValue.length() == 1) ? value.replaceAll("(?<=.{0}).(?=.*@)", "*") : "*"+ emailValue.substring(1,2)+"@"+value.split("@")[1];
                    else if (emailValue.length() == 3 || emailValue.length() == 4)
                        maskingValue = (emailValue.length() == 3) ? value.replaceAll("(?<=.{1}).(?=.*@)", "*") : emailValue.substring(0,1)+ "**" + emailValue.substring(3)+"@"+ value.split("@")[1]; 
                    else if (emailValue.length() > 4)
                        maskingValue = emailValue.substring(0,1)+ "***" + emailValue.substring(4)+"@"+ value.split("@")[1];
                }
                break;     
            case Address:
                StringBuilder address = new StringBuilder();
                for (int i =0; i < value.length(); i++) {
                    char item = value.charAt(i);
                    address.append(Character.isWhitespace(item) ? item : '*');
                }
                maskingValue = address.toString();
                break;
            case BankName:
                if(value.length() > 2) {
                    maskingValue =  "**" + value.substring(2); 
                }else {
                    maskingValue = "**";
                }
                break;
            case AccountNumber:
                StringBuilder accountNumber = new StringBuilder();
                int length = maskingValue.length();
                if(length > 6) {
                    accountNumber.append(value.substring(0,6)); //what if a/c no length is less than 7
                }
                for (int i = 0; i <= length - 7; i++) {
                    accountNumber.append("*");
                }
                maskingValue = accountNumber.toString();
                break;
            case Year:
                StringBuilder year = new StringBuilder();
                for (int i =0; i < value.length(); i++) {
                    char item = value.charAt(i);
                    year.append(Character.isWhitespace(item) ? item : '*');
                }
                maskingValue = year.toString();
                break;
            case Month:
                StringBuilder month = new StringBuilder();
                for (int i =0; i < value.length(); i++) {
                    char item = value.charAt(i);
                    month.append(Character.isWhitespace(item) ? item : '*');
                }
                maskingValue = month.toString();
                break;
            }
        return maskingValue;
    }

    public static void main(String[] args) throws Exception { 
        String originalName = "홍길동";
        String maskedName = maskAs(originalName, TT.MaskingType.Name);

        String originalMobile = "01012345678";
        String maskedMobile = maskAs(originalMobile, TT.MaskingType.Mobile);

        String originalEmail = "abcde@testemail.com";
        String maskedEmail = maskAs(originalEmail, TT.MaskingType.Email);

        String originalAddress = "서울특별시 중구 세종대로 110 서울특별시청";
        String maskedAddress = maskAs(originalAddress, TT.MaskingType.Address);

        String originalBankName = "국민은행";
        String maskedBankName = maskAs(originalBankName, TT.MaskingType.BankName);

        String originalAccountNumber = "1234567890123456";
        String maskedAccountNumber = maskAs(originalAccountNumber, TT.MaskingType.AccountNumber);

        String originalYear = "2023";
        String maskedYear = maskAs(originalYear, TT.MaskingType.Year);

        String originalMonth = "December";
        String maskedMonth = maskAs(originalMonth, TT.MaskingType.Month);

        // Print the masked values
        System.out.println("Original Name: " + originalName + ", Masked Name: " + maskedName);
        System.out.println("Original Mobile: " + originalMobile + ", Masked Mobile: " + maskedMobile);
        System.out.println("Original Email: " + originalEmail + ", Masked Email: " + maskedEmail);
        System.out.println("Original Address: " + originalAddress + ", Masked Address: " + maskedAddress);
        System.out.println("Original Bank Name: " + originalBankName + ", Masked Bank Name: " + maskedBankName);
        System.out.println("Original Account Number: " + originalAccountNumber + ", Masked Account Number: " + maskedAccountNumber);
        System.out.println("Original Year: " + originalYear + ", Masked Year: " + maskedYear);
        System.out.println("Original Month: " + originalMonth + ", Masked Month: " + maskedMonth);
    }
}

 

 


 

소스코드 결과

반응형

댓글

💲 추천 글