Here you will see all steps to mask confidential/ information in XML like credit card, CVV, Exp date, SSN, password etc. So that it will print in mask form as ****** so that unauthorize use will not misuse of others information.
Pre- Requisite
Use below library or add in pom.xml.
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
Here is same XML file as AccountDetail.xml where need to mask cardNumber, cvv and expDate .
<AccountList>
<Account>
<id>E001</id>
<FirstName>Saurabh</FirstName>
<LastName>Gupta</LastName>
<AddressDetail>
<AddressLine1>Noida City Center</AddressLine1>
<City>Noida</City>
<State>UP</State>
<Pincode>201301</Pincode>
<Contry>India</Contry>
</AddressDetail>
<CreditCardDetail>
<CardNumber>1233454565676567</CardNumber>
<CVV>456</CVV>
<ExpDate>12/90</ExpDate>
</CreditCardDetail>
</Account>
<Account>
<id>E002</id>
<FirstName>Ankur</FirstName>
<LastName>Mehrotra</LastName>
<AddressDetail>
<AddressLine1>New Delhi Metro Station</AddressLine1>
<City>New Delhi</City>
<State>UP</State>
<Pincode>210345</Pincode>
<Contry>India</Contry>
</AddressDetail>
<CreditCardDetail>
<CardNumber>8967452312123456</CardNumber>
<CVV>876</CVV>
<ExpDate>09/83</ExpDate>
</CreditCardDetail>
</Account>
<Account>
<id>E003</id>
<FirstName>Shailesh</FirstName>
<LastName>Nagar</LastName>
<AddressDetail>
<AddressLine1>Dwarka Metro Station</AddressLine1>
<City>Delhi</City>
<State>Delhi</State>
<Pincode>345876</Pincode>
<Contry>India</Contry>
</AddressDetail>
<CreditCardDetail>
<CardNumber>9078563412345678</CardNumber>
<CVV>986</CVV>
<ExpDate>08/99</ExpDate>
</CreditCardDetail>
</Account>
</AccountList>
Java code to mask above XML. In below code cardNumber is masking partially so that show last four digits only and hide rest of numbers while cvv and exp date digits are masked completely.
package com.mask.xml;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.parser.Parser;
import org.jsoup.select.Elements;
public class MaskXML {
public static void main(String[] args) {
try {
FileInputStream inputStream = new FileInputStream(
new File("D:\\Saurabh Gupta\\Workspace\\JavaTestExamples\\src\\main\\resources\\UserAccountDetail.xml"));
Document doc = Jsoup.parse(inputStream, "UTF-8", "", Parser.xmlParser());
Elements toMaskTagCompletely = doc.select("Pincode,ExpDate,CVV");
Elements toMaskTagPartially = doc.select("CardNumber");
for (Element element : toMaskTagCompletely) {
element.text(replaceDigits(element.text()));
}
for (Element element : toMaskTagPartially) {
element.text("XXXXXXXXXXXX" + element.text().substring(element.text().length() - 4));
}
System.out.println(doc.toString());
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
private static String replaceDigits(String text) {
StringBuffer buffer = new StringBuffer(text.length());
Pattern pattern = Pattern.compile("\\d");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
matcher.appendReplacement(buffer, "X");
}
return buffer.toString();
}
}
Result : Masked XML
<?xml version="1.0" encoding="UTF-8"?>
<AccountList>
<Account>
<id>
E001
</id>
<FirstName>
Saurabh
</FirstName>
<LastName>
Gupta
</LastName>
<AddressDetail>
<AddressLine1>
Noida City Center
</AddressLine1>
<City>
Noida
</City>
<State>
UP
</State>
<Pincode>
XXXXXX
</Pincode>
<Contry>
India
</Contry>
</AddressDetail>
<CreditCardDetail>
<CardNumber>
XXXXXXXXXXXX6567
</CardNumber>
<CVV>
XXX
</CVV>
<ExpDate>
XX/XX
</ExpDate>
</CreditCardDetail>
</Account>
<Account>
<id>
E002
</id>
<FirstName>
Ankur
</FirstName>
<LastName>
Mehrotra
</LastName>
<AddressDetail>
<AddressLine1>
New Delhi Metro Station
</AddressLine1>
<City>
New Delhi
</City>
<State>
UP
</State>
<Pincode>
XXXXXX
</Pincode>
<Contry>
India
</Contry>
</AddressDetail>
<CreditCardDetail>
<CardNumber>
XXXXXXXXXXXX3456
</CardNumber>
<CVV>
XXX
</CVV>
<ExpDate>
XX/XX
</ExpDate>
</CreditCardDetail>
</Account>
<Account>
<id>
E003
</id>
<FirstName>
Shailesh
</FirstName>
<LastName>
Nagar
</LastName>
<AddressDetail>
<AddressLine1>
Dwarka Metro Station
</AddressLine1>
<City>
Delhi
</City>
<State>
Delhi
</State>
<Pincode>
XXXXXX
</Pincode>
<Contry>
India
</Contry>
</AddressDetail>
<CreditCardDetail>
<CardNumber>
XXXXXXXXXXXX5678
</CardNumber>
<CVV>
XXX
</CVV>
<ExpDate>
XX/XX
</ExpDate>
</CreditCardDetail>
</Account>
</AccountList>
Summary
- Example for mask XML.
- Shared API and source code for masking XML in less code.
- Shared code for Mask complete and partial text data for credit card, SSN, CVV etc.
See Also
Below are some more masking ways for different type of data like XML, JSON and printing objects before logging , sending to page or transferring over network.
- Log4j2: How to Mask Logs Personal/Confidential/SPI Information
- How to Mask JSON Confidential/Personal Information in logs :JAVA
- How to mask JAVA Object confidential/personal information in logs while Printing
Related Posts
Your Feedback Motivate Us
If our FacingIssuesOnIT Experts solutions guide you to resolve your issues and improve your knowledge. Please share your comments, like and subscribe to get notifications for our posts.
Happy Learning !!!
2 thoughts on “How to MASK XML Confidential/Personal Data : JAVA”
You must log in to post a comment.