Mercator 10.10 of later biedt extra bescherming voor bestanden die gevoelige gegevens bevatten en bewaard worden in de SQL-database. Zoals bijvoorbeeld vertrouwelijke artikelinformatie, identiteitskaartscans, bankidentiteitsverklaringen, etc. Deze beveiliging wordt uitgevoerd in de vorm van versleuteling in de SQL-database. Deze bestanden worden pas leesbaar in Mercator als Mercator werkt op een computer met het certificaat dat gebruikt wordt voor encryptie.
Samengevat, deze bestanden
- zullen onleesbaar zijn als Mercator draait zonder dit certificaat
- zullen onleesbaar zijn in een ander programma dan Mercator (bijvoorbeeld SQL Server client tools)
- zullen onleesbaar zijn in een ander programma dan Mercator, zelfs met het certificaat op de computer
- zullen leesbaar zijn als Mercator draait met dit certificaat
- zullen leesbaar zijn in een externe applicatie die MercatorUi.Main initialiseert op een computer met het certificaat en met behulp van de Mercator Tools (Api.Zselect).
Versleuteling en ontsleuteling wordt uitgevoerd door Mercator. Er mag dus niets veranderd worden aan de configuratie of aangepaste programmering in Mercator behalve als er rechtstreeks back-ups worden gemaakt van deze kolommen.
In tegenstelling tot versleutelde kolommen is er geen versleutelingsprocedure voor alle bestaande bestanden. Als gevolg hiervan kunnen versleutelde bestanden naast niet-versleutelde bestanden bestaan.
In de SQL-bestanden (SqlFileView) zijn versleutelde bestanden te herkennen aan dit kleine hangslot:
Certificaat installeren: zie deze pagina.
Zodra een bestand in de database wordt versleuteld kan de optie "Anderen / Thumbprintcertificaat voor gegevensversleuteling" (id = CERT_THUMB) niet meer gewijzigd worden.
Bestaand bestand versleutelen
Het versleutelen van een bestaand bestand gebeurt door te rechtsklikken op het bestand. Na bevestiging wordt de versleuteling onmiddellijk uitgevoerd en zal er geen back-up gevraagd worden.
Het is mogelijk om meerdere bestanden tegelijk te versleutelen door ze vooraf te selecteren. Bestanden die al versleuteld werden, zullen automatisch uitgesloten worden van de selectie.
Versleuteling bij bewaren
De SQL File Viewer in Mercator heeft dit selectievakje waarmee u kan bepalen of een nieuw bestand moet versleuteld worden bij het bewaren.
Standaard is dit vakje niet aangevinkt. Het is echter mogelijk om dit te wijzigen door de eigenschap Encryption van het SqlFileView-object:
- Never: nooit aangevinkt en kan niet gewijzigd worden
- Always: altijd aangevinkt en kan niet gewijzigd worden
- InitiallyUnchecked: uitgevinkt maar kan gewijzigd worden
- InitiallyChecked: aangevinkt maar kan gewijzigd worden
Versleutelen via code
Onderstaande code laat zien hoe u een hele reeks SQL-bestanden versleuteld (die zijn gekoppeld aan de ACH sequentie). Houd er rekening mee dat bestandsversleuteling een CPU- en RAM-intensieve bewerking is. Zo'n dergelijk proces kan dus een aanzienlijke uitvoeringstijd hebben.
In dit voorbeeld wordt ervan uitgegaan dat de code wordt uitgevoerd in Mercator en het certificaat en de bijhorende openbare sleutel beschikbaar zijn vanuit Mercator. Als dit niet het geval zou zijn, moet u de publieke sleutel van het certificaat nemen en vervolgens dit certificaat importeren (zonder private sleutel) en dan de code aanpassen zoals in het tweede voorbeeld onderaan deze pagina (gebruik van MercatorEncryptRsaAes om de parameter certificate door te geven:)
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;
// <CompileWithRoslyn />
namespace MyNameSpace
{
public class Class1 : MercatorUi.Interfaces.IExec
{
public void Main()
{
DataSet ds = Api.Zselect(MercatorUi.Globals.RepData, @"select id,filecontent from FILES where (filepath like '<Files\ACH\%') and (filecontent is not null) and (DATALENGTH(filecontent) > 0) and (dbo.IS_BINARY_MERCATORENCRYPTED(filecontent)=0)");
if (ds == null)
return;
int nok = 0;
int nko = 0;
using (MercatorSqlConnection conn = new MercatorSqlConnection(MercatorUi.Globals.RepData, true))
{
if (conn.Connection == null)
return;
Api.IsWeb = true; // geen foutmelding krijgen als Api.SqlExec false teruggeeft
try
{
MercatorUi.Progress.ProgressCreate(ds.Tables[0].Rows.Count);
using (SqlCommand cmd = new SqlCommand("update FILES set filecontent=@filecontent where id=@id", conn.Connection))
{
foreach (DataRow dr in ds.Tables[0].Rows)
{
MercatorUi.Progress.ProgressCreate(1);
cmd.Parameters.AddWithValue("@id", dr["id"]); //guid -> uniqueidentifier
cmd.Parameters.AddWithValue("@filecontent", MercatorCryptorEngine.CryptorEngine.MercatorEncryptRsaAes((byte[])dr["filecontent"]));
if (Api.SqlExec(cmd))
nok++;
else
nko++;
cmd.Parameters.Clear();
}
}
MercatorUi.Progress.ProgressDestroy();
}
finally
{
Api.IsWeb = false;
}
}
Dialogs.Stop($"Versleutelde bestanden: {nok}.\r\nNiet-versleutelde bestanden: {nko}.");
}
}
}