I just published a new version of my open source C# Zoro library in Github and Nuget.org.
Zoro is a data masking/anonymization utility. It fetches data from a database or a CSV file, masks (i.e. anonymizes) them according to the configuration provided and uses the masked data to create a CSV file or run SQL statements such as INSERTs or UPDATEs.
The new version, 2.0, has been converted to DotNet Standard 2.1 to take advantage of some useful DotNet features. The command line utility and the test project are written with DotNet Core 5.0.
The issue from 1.0.2, where the Nuget package did not contain the executables, has been corrected. The package now contains both a Win64 and a Linux64 executable. Since they are self-contained programs, no prior installation of DotNet is needed.
But the most important new feature is a new MaskType, “Query”. With this, the library can retrieve values from a database and pick a random one. In previous versions this was only possible with lists that were fixed in the XML (MaskType=List).
For example, let’s say you are masking the following data:
ID | Name | City | Country |
1 | ABB | Baden | CH |
2 | FAGE | Athens | GR |
3 | IKEA | Delft | NL |
In the database you might also have a table with cities and countries:
CityName | CountryCode |
Zürich | CH |
Geneva | CH |
Bern | CH |
Rethimno | GR |
Chania | GR |
Kalamata | GR |
Gouda | NL |
Geldrop | NL |
In order to anonymize the above data, your config could look like this:
<?xml version="1.0"?>
<MaskConfig xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<FieldMasks>
<FieldMask>
<FieldName>ID</FieldName>
<MaskType>None</MaskType>
</FieldMask>
<FieldMask>
<FieldName>Name</FieldName>
<MaskType>Similar</MaskType>
</FieldMask>
<FieldMask>
<FieldName>Country</FieldName>
<MaskType>None</MaskType>
</FieldMask>
<FieldMask>
<FieldName>City</FieldName>
<MaskType>Query</MaskType>
<QueryReplacement
SelectorField="Country"
GroupField="Countrycode"
ValueField="Cityname"
Query="SELECT cityname, countrycode FROM cities" />
</FieldMask>
</FieldMasks>
<DataSource>Database</DataSource>
<DataDestination>Database</DataDestination>
<ConnectionString>
Server=DBSRV1;Database=appdb;Trusted_Connection=yes;
</ConnectionString>
<ConnectionType>
System.Data.SqlClient
</ConnectionType>
<SqlSelect>
SELECT * FROM customers
</SqlSelect>
<SqlCommand>
INSERT INTO customers_anonymous
(ID, Name, City, Country)
VALUES
($ID, $Name, $City, $Country)
</SqlCommand>
</MaskConfig>
This will result in a table looking like this:
ID | Name | City | Country |
1 | EGT | Bern | CH |
2 | SOLE | Chania | GR |
3 | UFOE | Geldrop | NL |
If you have any questions, please write in the comments.
Enjoy!