{"id":13874,"date":"2020-07-02T10:47:04","date_gmt":"2020-07-02T14:47:04","guid":{"rendered":"http:\/\/www.iri.com\/blog\/?p=13874"},"modified":"2024-01-15T06:45:33","modified_gmt":"2024-01-15T11:45:33","slug":"darkshield-relational-databases","status":"publish","type":"post","link":"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/","title":{"rendered":"Using DarkShield with Relational Databases"},"content":{"rendered":"<p><em><strong>Editor&#8217;s Note:<\/strong> The content in this article has been deprecated with the release of IRI DarkShield <a href=\"https:\/\/www.iri.com\/news\/press-releases\/new-darkshield-version-finds-and-masks-more-pii-data-at-risk\">Version 5<\/a> in 2024. To see how you can search and mask data in RDBs with the DarkShield GUI now, see <a href=\"https:\/\/www.iri.com\/blog\/data-protection\/finding-and-masking-pii-in-relational-databases-with-the-darkshield-rdb-wizard\/\">this article<\/a>. To see how to do it in the API, see <a href=\"https:\/\/www.iri.com\/blog\/data-protection\/iri-darkshield-rdb-rpc-api\/\">this article<\/a>.<\/p>\n<p><\/em><\/p>\n<h5><b>Introduction<\/b><\/h5>\n<p>In the previous <a href=\"https:\/\/www.iri.com\/blog\/data-protection\/darkshield-introduction\/\">article<\/a>, we discussed how <a href=\"https:\/\/www.iri.com\/products\/darkshield\">IRI DarkShield<\/a> finds sensitive information using Data Class Search Matchers and masks it consistently using Data Rules. We also alluded to DarkShield\u2019s internal processing model, which is based on an abstract view of data as a collection of documents. Understanding this model will help you understand how DarkShield handles structured, semi-structured and unstructured data in relational databases in much the same way it does file-based documents in local file systems, network shares, or S3 buckets.<\/p>\n<p>Note that the functionality described in this article is only supported through the <a href=\"https:\/\/www.iri.com\/products\/workbench\">IRI Workbench<\/a> graphical IDE, built on Eclipse. It cannot be replicated through the DarkShield Command Line Interface (CLI) or Remote Procedure Call (RPC) API frameworks at this time.<\/p>\n<h5><b>DarkShield vs. FieldShield<\/b><\/h5>\n<p><a href=\"https:\/\/www.iri.com\/products\/fieldshield\">IRI FieldShield<\/a> has been the primary product for masking data in flat files and relational databases. There is now overlap due to DarkShield\u2019s new ability to classify, reach, and mask the same data as FieldShield. The main difference between the two is that FieldShield deals with data on a column basis, while DarkShield\u2019s approach to searching and masking is more granular.<\/p>\n<p>Thus in practice, DarkShield can find and mask PII in Large Objects (LOBs), XML, and other free-form text embedded within columns, while FieldShield can only work with First Normal Form (1NF) atomic column data. However, DarkShield jobs can only discover, extract, and mask data, while FieldShield job specifications can be also be used to \u201cmask data on the fly\u201d within <a href=\"https:\/\/www.iri.com\/products\/voracity\">IRI Voracity<\/a>-supported ETL, subsetting, migration, replication, cleansing, and reporting scripts.<\/p>\n<p>Following is a comparison of DB-centric capabilities in DarkShield and FieldShield:<\/p>\n<p><a href=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-table.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-13884 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-table.png\" alt=\"\" width=\"670\" height=\"424\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-table.png 670w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-table-300x190.png 300w\" sizes=\"(max-width: 670px) 100vw, 670px\" \/><\/a><\/p>\n<p>Both products share the same Eclipse front-end (<a href=\"https:\/\/www.iri.com\/products\/workbench\">IRI Workbench<\/a>), executable back-end (<a href=\"https:\/\/www.iri.com\/products\/cosort\/sortcl\">SortCL<\/a>), data classes, and masking functions. That means you can, for example, encrypt in DarkShield and decrypt in FieldShield, for example. The key interface difference is in their job design wizards and serialized configuration files (defining the masking jobs).<\/p>\n<p>Both DarkShield and Fieldshield are also included in the\u00a0<a href=\"https:\/\/www.iri.com\/products\/voracity\">IRI Voracity<\/a> data management platform (along with CellShield EE and RowGen), should you require both and more <a href=\"https:\/\/www.iri.com\/products\/voracity\/technical-details#capabilities\">capabilities<\/a>.\u00a0 DarkShield pricing information is on <a href=\"https:\/\/www.iri.com\/products\/darkshield\/platforms-pricing\">this<\/a> page.<\/p>\n<h5><b>Tables are Documents, Cells are Embedded Documents<\/b><\/h5>\n<p>To understand the extent of DarkShield searching and masking capabilities within relational databases, it\u2019s important to remember the DarkShield mantra that \u201ceverything is a document.\u201d In the context of relational databases, every table is considered a tabular document, which means it can be filtered by column name or index much like you would a CSV or Excel file.<\/p>\n<p>Moreover, every cell inside of a table is treated as an embedded document, meaning that cells will be parsed according to their detected media type (text, json, pdf, etc.). Embedded PDFs and images in BLOB columns, for example, will be searched and masked as if they were regular files in a file system, but stored inside the table.<\/p>\n<p>To reinforce this mental model, we will show you how DarkShield handles a table containing free form text and XML data. The same logic that we will outline here can be applied to tables which contain BLOB data, like embedded images and PDFs.<\/p>\n<h5><b>Data Connectivity and Setup<\/b><\/h5>\n<p>If you don\u2019t have any connection profiles to the database(s) that DarkShield needs to access, refer to\u00a0<a href=\"https:\/\/www.iri.com\/services\/training\/courseware#install\">these example how-tos<\/a>\u00a0to add them in IRI Workbench; note that only JDBC connections are needed for DarkShield. The rest of this article assumes that you are familiar with Data Classes and Data Rules from our introductory article, which we encourage you to read before continuing now.<\/p>\n<p>To demonstrate DarkShield RDB search\/mask capabilities, I created a simple Postgres table named \u201cclients\u201d, which contains some structured columns (name, email), as well as an XML column for address data (address_xml), and a free-flowing text field (notes).<\/p>\n<p>The DDL for this table can be created and executed in Workbench by clicking <a href=\"\/blog\/wp-content\/uploads\/2020\/07\/sql-scrapbook-workbench-con.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13878\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/sql-scrapbook-workbench-con.gif\" alt=\"\" width=\"16\" height=\"16\" \/><\/a> on SQL scrapbook in the\u00a0<a href=\"\/blog\/wp-content\/uploads\/2020\/07\/data-source-explorer-workbench-icon.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13880\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/data-source-explorer-workbench-icon.png\" alt=\"\" width=\"16\" height=\"16\" \/><\/a> <i>Data Source Explorer<\/i> view, selecting the connection profile in the <i>Name <\/i>field (in our case, the connection profile is called <i>DarkShield<\/i>), and running this DDL statement:<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-connection-profile.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13886 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-connection-profile-1024x711.png\" alt=\"\" width=\"704\" height=\"489\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-connection-profile-1024x711.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-connection-profile-300x208.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-connection-profile-768x533.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-connection-profile.png 1053w\" sizes=\"(max-width: 704px) 100vw, 704px\" \/><\/a><\/p>\n<p>We can right click inside the scrapbook and select <i>Execute All<\/i> to create two tables, one inside our <i>public <\/i>schema to act as our source table and another inside the <i>target <\/i>schema. Note that if the target table doesn\u2019t exist, DarkShield will try to automatically create a target table DDL from the metadata of the source table.<\/p>\n<p>If the DDL fails to execute, DarkShield will log an error in the error view. To see what DDL DarkShield will attempt to generate for your source table, navigate to the table in the Data Source Explorer, right click on the table and select <i>Generate DDL<\/i>.<\/p>\n<p>Populating this table with test data is outside the scope of this article. Please see <a href=\"http:\/\/www.iri.com\/products\/rowgen\">IRI RowGen<\/a> for more information about our product synthesizing structurally and referentially correct RDB test data from scratch. RowGen also runs from IRI Workbench and is included in Voracity.<\/p>\n<h5><b>The Dark Data Schema Masking Wizard<\/b><\/h5>\n<p>Once your connections are established, you can start defining your search and masking criteria. From the\u00a0<a href=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-workbench-icon.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13881\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-workbench-icon.png\" alt=\"\" width=\"16\" height=\"16\" \/><\/a> <i>DarkShield menu<\/i> dropdown options off the IRI Workbench top toolbar, select the <i>New Dark Data Schema Search\/Masking Job <\/i>option.<\/p>\n<h5><b>Source Selector<\/b><\/h5>\n<p>After specifying your Workbench project and job names in the setup page, click <i>Next <\/i>to begin filling out the <i>Source Selector <\/i>page. Here, we can select our connection profile or create a new one from scratch, and then select the schema we wish to search for sensitive information:<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-source-selector.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13887 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-source-selector-1024x756.png\" alt=\"\" width=\"703\" height=\"519\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-source-selector-1024x756.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-source-selector-300x222.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-source-selector-768x567.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-source-selector.png 1204w\" sizes=\"(max-width: 703px) 100vw, 703px\" \/><\/a><\/p>\n<p>The form also contains several optional fields:<\/p>\n<ul>\n<li><i>Include<\/i>: A regular expression pattern for including tables. In our example, we set the field to \u201cclients\u201d, which is our newly created source table.<\/li>\n<li><i>Exclude<\/i>: Another regular expression pattern for excluding tables. If both an <i>Include <\/i>and an <i>Exclude <\/i>pattern is specified, both will be applied to filter the table names.<\/li>\n<li><i>Fetch Size<\/i>: This is an important parameter for defining how many rows are fetched from a table in one network pass. Note that this parameter does not limit the number of rows searched, but instead affects the number of fetches that will need to be performed to read the entire table. You may want to tweak the fetch size depending on the amount of memory on your computer, the size of the returned rows, and the network latency. Note that the JDBC specification classifies this option as a hint, so it\u2019s up to the driver whether this parameter is used.<\/li>\n<\/ul>\n<p>If you are not comfortable using regular expressions for filtering on tables, DarkShield also respects any schema and table filters that were applied directly to the connection profile itself. To create the table\/schema filters, right click on the connection profile in the Data Source explorer and select <i>Properties<\/i>, then select either the <i>Default Schema Filter <\/i>or the <i>Default Table Filter <\/i>tab and enter your filter expression:<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-darkshield-properties.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13885 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-darkshield-properties-1024x557.png\" alt=\"\" width=\"746\" height=\"406\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-darkshield-properties-1024x557.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-darkshield-properties-300x163.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-darkshield-properties-768x417.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-darkshield-properties.png 1238w\" sizes=\"(max-width: 746px) 100vw, 746px\" \/><\/a><\/p>\n<p>After finishing the Source Selector page, click <i>Next <\/i>to continue to the <i>Target Selector <\/i>page.<\/p>\n<h5><b>Target Selector<\/b><\/h5>\n<p>On the Target Selector page, we specify the target of all the masked source tables. You can select a different connection profile and\/or schema to target different tables, or select the same schema as the source to overwrite the original source tables.<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-target-selector.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13889 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-target-selector-1024x756.png\" alt=\"\" width=\"704\" height=\"520\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-target-selector-1024x756.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-target-selector-300x222.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-target-selector-768x567.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-target-selector.png 1204w\" sizes=\"(max-width: 704px) 100vw, 704px\" \/><\/a><\/p>\n<p>DarkShield uses a set of strategies to determine how the target tables will be populated with masked data depending on the relationship between the source and target schemas:<\/p>\n<ul>\n<li>If we\u2019re updating the source schema, DarkShield will attempt to find a primary key, unique index, or compound key for each source table in order to create the necessary batched update statements. Tables without any unique keys specified in the metadata cannot be updated by DarkShield, which will log an error.<\/li>\n<li>If targeting a separate schema and a table with the same name already exists, DarkShield will check the column names to make sure they match between source and target. If they match, the target table will be truncated, otherwise it will be dropped and re-created using the source table metadata. Batched insert statements will be created.<\/li>\n<li>If the target table does not exist, a new table will be created using the source table metadata. Batched insert statements will be created.<\/li>\n<\/ul>\n<p>By default, the batch size for the inserts\/updates will be equal to the fetch size. This option may become configurable in the future.<\/p>\n<p>All DarkShield DDL and DML operations are executed in a transaction, which means that if a failure occurs, DarkShield will attempt to rollback the changes to prevent saving the masked table in an incomplete state. This is particularly useful when updating source tables to prevent only partial masking of the data.<\/p>\n<p>The form also contains several optional fields:<\/p>\n<ul>\n<li><i>Foreign key constraints<\/i>: select this checkbox if you want to preserve the foreign key constraints in the masked tables when targeting a different schema. This option only affects tables that are created by DarkShield, constraints for existing tables will not be affected. If the filtered source tables contain foreign key references to tables that are not included in the set of source tables that are being searched and masked, they will be copied over without any changes to the target table. Foreign key constraints are enabled after all the masked tables have been created. Any validation errors when attempting to enforce the foreign key constraints will be logged in the error view, but the masked table will remain in place. It will be up to the user to re-enable any foreign key constraints that could not be created manually in those cases.<\/li>\n<li><i>Disable DDL transactions<\/i>: select this option to disable transactions for DDL statements. Certain Databases, like Oracle, do not support executing DROP and TRUNCATE statements inside of a transaction. By default, DarkShield will exit with an error message if it needs to execute a DDL statement within a database that does not support DDL transactions. Use this option with care, since you may risk losing the original data in your target tables if DarkShield fails to perform the masking and is forced to execute a rollback. This option is not relevant for updating the original source tables, since no DDL statements are executed.<\/li>\n<\/ul>\n<p>Click <i>Next <\/i>to proceed to the <i>Search Matchers <\/i>page.<\/p>\n<h5><b>Search Matchers<\/b><\/h5>\n<p>With the source and target configuration out of the way, we can now focus on defining how data will be found and masked. Let\u2019s start defining new Search Matchers for our data.<\/p>\n<h5><b>NameColumnMatcher<\/b><\/h5>\n<p>Click <i>Add <\/i>to open the <i>Search Matcher Details <\/i>dialog. In the <i>Name <\/i>field, enter the name \u201cNameColumnMatcher\u201d.<\/p>\n<p>The first Search Matcher we define will deal with the 1NF column for people\u2019s names. If we had a set file containing a list of names, we could search using that, but that\u2019s less efficient and reliable if we know the pattern for the column headers containing names. While FieldShield can classify an entire column as a NAMES column based on either its name or contents, DarkShield can filter on specific column names and then select all the contents within as sensitive data.<\/p>\n<p>In the <i>Data Class Name <\/i>field, click <i>Create <\/i>to create and save a new Data Class or Group in the global IRI Preferences.<\/p>\n<p>Let\u2019s create a Data Class that will match on all data that it encounters. Click on <i>Add <\/i>to add a new Data Class Matcher to our Data Class. In the <i>Type <\/i>field, select <i>Pattern <\/i>and in the <i>Details <\/i>field enter the pattern \u201c.+\u201d.<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-matcher.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13890 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-matcher-1024x731.png\" alt=\"\" width=\"699\" height=\"499\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-matcher-1024x731.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-matcher-300x214.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-matcher-768x548.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-matcher.png 1246w\" sizes=\"(max-width: 699px) 100vw, 699px\" \/><\/a><\/p>\n<p>Click <i>OK<\/i> to create the Data Class Matcher, then in the <i>Name <\/i>field of the Data Class enter the name \u201cALL\u201d to signify this Data Class will match on all data. Click <i>OK <\/i>to create the Data Class.<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-or-group.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13891 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-or-group-1024x756.png\" alt=\"\" width=\"700\" height=\"517\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-or-group-1024x756.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-or-group-300x222.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-or-group-768x567.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-or-group.png 1204w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/a><\/p>\n<p>By itself, this Data Class is not very useful, since it will match and mask all of the contents of the table. To limit the scope of the Data Class to the \u201cnames\u201d column, in the <i>Filters <\/i>field click <i>Add <\/i>to create a new filter.<\/p>\n<p>In the <i>Type <\/i>field, select the <i>Table Header Pattern <\/i>option to allow for filtering on table header columns. In the <i>Pattern<\/i> field, enter the regular expression pattern \u201c.*name\u201d, which will filter on any column which ends with the text \u201cname\u201d (for example, \u201cfirst_name\u201d, \u201clast_name\u201d, or \u201cname\u201d). Click <i>OK <\/i>to add the filter.<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-filter.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-13892 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-filter-1024x756.png\" alt=\"\" width=\"702\" height=\"518\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-filter-1024x756.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-filter-300x222.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-filter-768x567.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-filter.png 1204w\" sizes=\"(max-width: 702px) 100vw, 702px\" \/><\/a><\/p>\n<p>Finally, select or create a Data (Masking) Rule to apply to the names. For this example, we selected the Format Preserving Encryption rule. Your final Search Matcher should look like this:<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13893 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-1024x674.png\" alt=\"\" width=\"700\" height=\"461\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-1024x674.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-300x198.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-768x506.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher.png 1374w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/a><\/p>\n<h5><b>EmailMatcher<\/b><b><br \/>\n<\/b><\/h5>\n<p>Click <i>Add <\/i>to open the <i>Search Matcher Details <\/i>dialog. In the <i>Name <\/i>field, enter the name \u201cEmailMatcher\u201d.<\/p>\n<p>Much like the \u201cnames\u201d column, the \u201cemails\u201d column can be handled by a combination of the <i>ALL <\/i>Data Class and a Table Header Pattern filter that filters on email columns. However, email addresses have a unique structure which makes them very easy to match using a regular expression pattern.<\/p>\n<p>An additional advantage of using the pattern is that emails are not limited to being found in 1NF columns, and can also be found in free-flowing text or other embedded documents, like the \u201cnotes\u201d column.<\/p>\n<p>IRI Workbench ships with an <i>EMAILS<\/i> Data Class. Use it in the <i>Data Class Name <\/i>field by clicking <i>Browse <\/i>and selecting <i>EMAILS <\/i>from the dropdown.<\/p>\n<p>Finally, select or create a Data Rule which will be applied to the emails. For this example, we selected a sha2 Hashing rule. Your final Search Matcher should look like this:<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13894 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-2-1024x770.png\" alt=\"\" width=\"701\" height=\"527\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-2-1024x770.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-2-300x225.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-2-768x577.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-2.png 1204w\" sizes=\"(max-width: 701px) 100vw, 701px\" \/><\/a><\/p>\n<h5><b>AddressMatcher<\/b><\/h5>\n<p>Click <i>Add <\/i>to open the <i>Search Matcher Details <\/i>dialog. In the <i>Name <\/i>field, enter the name \u201cAddressMatcher\u201d.<\/p>\n<p>The address column in our source table contains XML data which details the address information, like the following example:<\/p>\n<pre>&lt;?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?&gt;\r\n\r\n&lt;address&gt;\r\n\r\n&lt;address&gt;3516 Annabelle St.&lt;\/address&gt;\r\n\r\n&lt;city&gt;Fort Washington&lt;\/city&gt;\r\n\r\n&lt;state&gt;Maryland&lt;\/state&gt;\r\n\r\n&lt;zipCode&gt;33987&lt;\/zipCode&gt;\r\n\r\n&lt;\/address&gt;<\/pre>\n<p>While this would be a trivial exercise if we had a set file containing a list of matching addresses to find and mask, this information may not be easily available. Instead, we will use the structure of the XML to find and mask the <i>address <\/i>tag.<\/p>\n<p>In the <i>Data Class Name <\/i>field, click <i>Browse <\/i>and select the <i>ALL <\/i>Data Class which you created for the <i>NameColumnMatcher<\/i>.<\/p>\n<p>In the <i>Filters<\/i> field, click <i>Add <\/i>to create a filter. In the <i>Type <\/i>field, select the <i>Table Header Pattern <\/i>option to allow for filtering on table header columns. In the <i>Pattern<\/i> field, enter the regular expression pattern \u201caddress_xml\u201d, which will filter on any column which matches the name \u201caddress_xml\u201d exactly. Click <i>OK<\/i> to add the filter.<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-filter-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13895 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-filter-2-1024x756.png\" alt=\"\" width=\"700\" height=\"517\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-filter-2-1024x756.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-filter-2-300x222.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-filter-2-768x567.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-filter-2.png 1204w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/a><\/p>\n<p>The table filter alone will allow us to mask every tag and attribute within the address field. If we wanted to only mask a specific tag, we can add an additional XPath filter.<\/p>\n<p>In the <i>Filters <\/i>field, click <i>Add<\/i> again to add another filter. In the <i>Type <\/i>field, select the <i>XML <\/i>option. In the <i>XML Path <\/i>field, enter the XPath \u201c\/address\/address\u201d. To learn more about XML and other path filters, please refer to our article on DarkShield filters.<\/p>\n<p>Finally, select or create a Data Rule which will be applied to the addresses. For this example, we selected a pseudonym rule which selects a random address from a set file. Your final Search Matcher should look like this:<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-3.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13896 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-3-1024x587.png\" alt=\"\" width=\"703\" height=\"403\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-3-1024x587.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-3-300x172.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-3-768x440.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-3.png 1578w\" sizes=\"(max-width: 703px) 100vw, 703px\" \/><\/a><\/p>\n<h5><b>NamesNerMatcher<\/b><\/h5>\n<p>While the email addresses will be matched by the <i>EmailMatcher<\/i>, we need a way to match the name using the structure of the sentence. For that, we can use a <i>Named Entity Recognition <\/i>(NER) model trained on finding person names. Learn about NER in DarkShield in this article (coming soon).<\/p>\n<p>The last column in the table contains a simple, free-text notes field in this sample format:<\/p>\n<pre>Hello, my name is {NAME} and my email address is {EMAIL}.<\/pre>\n<p>Click <i>Add <\/i>to open the <i>Search Matcher Details <\/i>dialog. In the <i>Name <\/i>field, enter the name \u201cNamesNerMatcher\u201d.<\/p>\n<p>In the <i>Data Class Name <\/i>field, click <i>Create <\/i>to create and save a new Data Class or Group in the global IRI Preferences.<\/p>\n<p>In the <i>Matchers <\/i>field, click <i>Add <\/i>to create a new Data Class matcher. In the <i>Type <\/i>field, select <i>NER Model<\/i>. Click <i>Browse<\/i> and select the path to the NER model which you can download <a href=\"http:\/\/opennlp.sourceforge.net\/models-1.5\/en-ner-person.bin\">here<\/a>.<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-matcher-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13898 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-matcher-2-1024x756.png\" alt=\"\" width=\"698\" height=\"515\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-matcher-2-1024x756.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-matcher-2-300x222.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-matcher-2-768x567.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-matcher-2.png 1204w\" sizes=\"(max-width: 698px) 100vw, 698px\" \/><\/a><\/p>\n<p>Click <i>OK <\/i>to add the matcher. In the <i>Name <\/i>field, enter the name \u201cNAMES_NER\u201d and click <i>OK<\/i> to create the new Data Class.<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-or-group-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13899 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-or-group-2-1024x756.png\" alt=\"\" width=\"700\" height=\"517\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-or-group-2-1024x756.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-or-group-2-300x222.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-or-group-2-768x567.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-class-or-group-2.png 1204w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/a><\/p>\n<p>Finally, select or create a Data Rule which will be applied to the names. For this example, we selected the same Format Preserving Encryption rule which we created for the <i>NameColumnMatcher<\/i>. Since the encryption rule will generate the same unique ciphertext for the same name, we will see its ability to preserve referential integrity across multiple columns.<\/p>\n<p>Your final Search Matcher should look like this:<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-4.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13900 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-4-1024x674.png\" alt=\"\" width=\"700\" height=\"461\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-4-1024x674.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-4-300x198.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-4-768x506.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matcher-4.png 1374w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/a><\/p>\n<h5><b>Finishing Up<\/b><\/h5>\n<p>All of our Search Matchers should now be created, and the <i>Search Matchers <\/i>page should show:<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matchers.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13901 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matchers-1024x697.png\" alt=\"\" width=\"699\" height=\"476\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matchers-1024x697.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matchers-300x204.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matchers-768x523.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-data-search-matchers.png 1306w\" sizes=\"(max-width: 699px) 100vw, 699px\" \/><\/a><\/p>\n<p>Click <i>Next <\/i>to proceed to the <i>PDF Configuration <\/i>page. As mentioned in the beginning of the article, DarkShield is capable of searching and masking PDF documents, so these options can be configured for cases when DarkShield encounters a PDF document embedded inside a BLOB column.<\/p>\n<p>You can safely skip this page, since we don\u2019t have any PDF documents in our current example.\u00a0 Read more about PDF-specific options in DarkShield in this article (coming soon).<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-pdf-configuration.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13902 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-pdf-configuration-1024x697.png\" alt=\"\" width=\"699\" height=\"476\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-pdf-configuration-1024x697.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-pdf-configuration-300x204.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-pdf-configuration-768x523.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-pdf-configuration.png 1306w\" sizes=\"(max-width: 699px) 100vw, 699px\" \/><\/a><\/p>\n<p>Click <i>Finish <\/i>to generate the <i>.search <\/i>configuration file for our job.<\/p>\n<h5><b>Execution and Results<\/b><\/h5>\n<p>To execute the search and masking job, right click on the generated <i>new_schema_search.search <\/i>file from the project explorer, and select <i>Run As -&gt; IRI Search and Masking Job<\/i>. A <i>new_schema_search.darkdata <\/i>file containing a list of search results in each searched table will be generated once the search and masking job completes:<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-generated-file.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13903 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-generated-file-1024x544.png\" alt=\"\" width=\"702\" height=\"373\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-generated-file-1024x544.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-generated-file-300x159.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-generated-file-768x408.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-generated-file.png 1600w\" sizes=\"(max-width: 702px) 100vw, 702px\" \/><\/a><\/p>\n<p>You can also compare the results between the two tables in Workbench by opening and viewing their sample contents (or selected Edit as I did) from the Data Source Explorer:<\/p>\n<p><a href=\"http:\/\/www.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-13904 aligncenter\" src=\"\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results-1024x544.png\" alt=\"\" width=\"700\" height=\"372\" srcset=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results-1024x544.png 1024w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results-300x159.png 300w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results-768x408.png 768w, https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results.png 1110w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/a><\/p>\n<p>Note how all the values in the names column were encrypted (with FPE) the same way they were in their floating location in the notes column. The email addresses were hashed, and the addresses in their XML tag were pseudonymized through a random pull from our set file of external address values.<\/p>\n<p>Please contact <a href=\"mailto:darkshield@iri.com\">darkshield@iri.com<\/a> if you have any questions or need help with your POC.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Editor&#8217;s Note: The content in this article has been deprecated with the release of IRI DarkShield Version 5 in 2024. To see how you can search and mask data in RDBs with the DarkShield GUI now, see this article. To see how to do it in the API, see this article. Introduction In the previous<\/p>\n<div><a class=\"btn-filled btn\" href=\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/\" title=\"Using DarkShield with Relational Databases\">Read More<\/a><\/div>\n","protected":false},"author":112,"featured_media":13904,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[8,91],"tags":[14,1398,1388,789,850,956,149],"class_list":["post-13874","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-protection","category-iri-workbench","tag-data-masking","tag-database-masking","tag-iri-darkshield","tag-iri-voracity","tag-iri-workbench","tag-jdbc","tag-pii"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Using DarkShield with Relational Databases - IRI<\/title>\n<meta name=\"description\" content=\"IRI DarkShield finds sensitive information using Data Class Search Matchers and masks it consistently using Data Rules. We also alluded to DarkShield\u2019s\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using DarkShield with Relational Databases - IRI\" \/>\n<meta property=\"og:description\" content=\"IRI DarkShield finds sensitive information using Data Class Search Matchers and masks it consistently using Data Rules. We also alluded to DarkShield\u2019s\" \/>\n<meta property=\"og:url\" content=\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/\" \/>\n<meta property=\"og:site_name\" content=\"IRI\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-02T14:47:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-15T11:45:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1110\" \/>\n\t<meta property=\"og:image:height\" content=\"590\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Dmitry Kulakov\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dmitry Kulakov\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/\"},\"author\":{\"name\":\"Dmitry Kulakov\",\"@id\":\"https:\/\/beta.iri.com\/blog\/#\/schema\/person\/6434d748d01ce766d6a2ff576d747cfb\"},\"headline\":\"Using DarkShield with Relational Databases\",\"datePublished\":\"2020-07-02T14:47:04+00:00\",\"dateModified\":\"2024-01-15T11:45:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/\"},\"wordCount\":3057,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/beta.iri.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results.png\",\"keywords\":[\"data masking\",\"database masking\",\"IRI DarkShield\",\"IRI Voracity\",\"IRI Workbench\",\"JDBC\",\"PII\"],\"articleSection\":[\"Data Masking\/Protection\",\"IRI Workbench\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/\",\"url\":\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/\",\"name\":\"Using DarkShield with Relational Databases - IRI\",\"isPartOf\":{\"@id\":\"https:\/\/beta.iri.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results.png\",\"datePublished\":\"2020-07-02T14:47:04+00:00\",\"dateModified\":\"2024-01-15T11:45:33+00:00\",\"description\":\"IRI DarkShield finds sensitive information using Data Class Search Matchers and masks it consistently using Data Rules. We also alluded to DarkShield\u2019s\",\"breadcrumb\":{\"@id\":\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#primaryimage\",\"url\":\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results.png\",\"contentUrl\":\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results.png\",\"width\":1110,\"height\":590},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/beta.iri.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using DarkShield with Relational Databases\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/beta.iri.com\/blog\/#website\",\"url\":\"https:\/\/beta.iri.com\/blog\/\",\"name\":\"IRI\",\"description\":\"Total Data Management Blog\",\"publisher\":{\"@id\":\"https:\/\/beta.iri.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/beta.iri.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/beta.iri.com\/blog\/#organization\",\"name\":\"IRI\",\"url\":\"https:\/\/beta.iri.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/beta.iri.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2019\/02\/iri-logo-total-data-management-small-1.png\",\"contentUrl\":\"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2019\/02\/iri-logo-total-data-management-small-1.png\",\"width\":750,\"height\":206,\"caption\":\"IRI\"},\"image\":{\"@id\":\"https:\/\/beta.iri.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/beta.iri.com\/blog\/#\/schema\/person\/6434d748d01ce766d6a2ff576d747cfb\",\"name\":\"Dmitry Kulakov\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/beta.iri.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c74394d71a1044376b7336db0b3ab4c7?s=96&d=blank&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c74394d71a1044376b7336db0b3ab4c7?s=96&d=blank&r=g\",\"caption\":\"Dmitry Kulakov\"},\"url\":\"https:\/\/beta.iri.com\/blog\/author\/dmitryk\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Using DarkShield with Relational Databases - IRI","description":"IRI DarkShield finds sensitive information using Data Class Search Matchers and masks it consistently using Data Rules. We also alluded to DarkShield\u2019s","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/","og_locale":"en_US","og_type":"article","og_title":"Using DarkShield with Relational Databases - IRI","og_description":"IRI DarkShield finds sensitive information using Data Class Search Matchers and masks it consistently using Data Rules. We also alluded to DarkShield\u2019s","og_url":"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/","og_site_name":"IRI","article_published_time":"2020-07-02T14:47:04+00:00","article_modified_time":"2024-01-15T11:45:33+00:00","og_image":[{"width":1110,"height":590,"url":"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results.png","type":"image\/png"}],"author":"Dmitry Kulakov","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Dmitry Kulakov","Est. reading time":"18 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#article","isPartOf":{"@id":"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/"},"author":{"name":"Dmitry Kulakov","@id":"https:\/\/beta.iri.com\/blog\/#\/schema\/person\/6434d748d01ce766d6a2ff576d747cfb"},"headline":"Using DarkShield with Relational Databases","datePublished":"2020-07-02T14:47:04+00:00","dateModified":"2024-01-15T11:45:33+00:00","mainEntityOfPage":{"@id":"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/"},"wordCount":3057,"commentCount":0,"publisher":{"@id":"https:\/\/beta.iri.com\/blog\/#organization"},"image":{"@id":"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#primaryimage"},"thumbnailUrl":"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results.png","keywords":["data masking","database masking","IRI DarkShield","IRI Voracity","IRI Workbench","JDBC","PII"],"articleSection":["Data Masking\/Protection","IRI Workbench"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/","url":"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/","name":"Using DarkShield with Relational Databases - IRI","isPartOf":{"@id":"https:\/\/beta.iri.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#primaryimage"},"image":{"@id":"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#primaryimage"},"thumbnailUrl":"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results.png","datePublished":"2020-07-02T14:47:04+00:00","dateModified":"2024-01-15T11:45:33+00:00","description":"IRI DarkShield finds sensitive information using Data Class Search Matchers and masks it consistently using Data Rules. We also alluded to DarkShield\u2019s","breadcrumb":{"@id":"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#primaryimage","url":"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results.png","contentUrl":"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results.png","width":1110,"height":590},{"@type":"BreadcrumbList","@id":"https:\/\/beta.iri.com\/blog\/data-protection\/darkshield-relational-databases\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/beta.iri.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Using DarkShield with Relational Databases"}]},{"@type":"WebSite","@id":"https:\/\/beta.iri.com\/blog\/#website","url":"https:\/\/beta.iri.com\/blog\/","name":"IRI","description":"Total Data Management Blog","publisher":{"@id":"https:\/\/beta.iri.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/beta.iri.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/beta.iri.com\/blog\/#organization","name":"IRI","url":"https:\/\/beta.iri.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/beta.iri.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2019\/02\/iri-logo-total-data-management-small-1.png","contentUrl":"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2019\/02\/iri-logo-total-data-management-small-1.png","width":750,"height":206,"caption":"IRI"},"image":{"@id":"https:\/\/beta.iri.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/beta.iri.com\/blog\/#\/schema\/person\/6434d748d01ce766d6a2ff576d747cfb","name":"Dmitry Kulakov","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/beta.iri.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c74394d71a1044376b7336db0b3ab4c7?s=96&d=blank&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c74394d71a1044376b7336db0b3ab4c7?s=96&d=blank&r=g","caption":"Dmitry Kulakov"},"url":"https:\/\/beta.iri.com\/blog\/author\/dmitryk\/"}]}},"jetpack_featured_media_url":"https:\/\/beta.iri.com\/blog\/wp-content\/uploads\/2020\/07\/darkshield-jdbc-results.png","_links":{"self":[{"href":"https:\/\/beta.iri.com\/blog\/wp-json\/wp\/v2\/posts\/13874"}],"collection":[{"href":"https:\/\/beta.iri.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/beta.iri.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/beta.iri.com\/blog\/wp-json\/wp\/v2\/users\/112"}],"replies":[{"embeddable":true,"href":"https:\/\/beta.iri.com\/blog\/wp-json\/wp\/v2\/comments?post=13874"}],"version-history":[{"count":13,"href":"https:\/\/beta.iri.com\/blog\/wp-json\/wp\/v2\/posts\/13874\/revisions"}],"predecessor-version":[{"id":17088,"href":"https:\/\/beta.iri.com\/blog\/wp-json\/wp\/v2\/posts\/13874\/revisions\/17088"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/beta.iri.com\/blog\/wp-json\/wp\/v2\/media\/13904"}],"wp:attachment":[{"href":"https:\/\/beta.iri.com\/blog\/wp-json\/wp\/v2\/media?parent=13874"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/beta.iri.com\/blog\/wp-json\/wp\/v2\/categories?post=13874"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/beta.iri.com\/blog\/wp-json\/wp\/v2\/tags?post=13874"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}