En lien avec la fonctionnalité de cryptage des colonnes dans la base de données, le code ci-dessous montre comment crypter une colonne d'une table non connue de Mercator mais présente dans sa base de données.
public void Main()
{
using (MercatorSqlConnection sqlConn = new MercatorSqlConnection(Globals.RepData, true))
{
if (sqlConn.Connection == null)
return;
using (SqlTransaction trans = sqlConn.Connection.BeginTransaction())
using (SqlCommand sqlCommand = new SqlCommand("select id,userpsw from matablecustom where userpsw<>''", sqlConn.Connection, trans))
{
DataSet ds = Api.Zselect(sqlConn.Connection, sqlCommand);
if (ds == null)
return;
foreach (DataRow dr in ds.Tables[0].Rows)
dr["userpsw"] = MercatorCryptorEngine.CryptorEngine.MercatorEncryptRsaAes(dr["userpsw"].ToString());
if (!Api.BulkDataTable(ds.Tables[0], "#matablecustom", sqlConn.Connection, trans, "matablecustom"))
return;
sqlCommand.CommandText = "update matablecustom set userpsw = #matablecustom.userpsw from #matablecustom where #matablecustom.id = teamviewer.id \r\n"
+ "alter table matablecustom add constraint USERPSW_ENCRYPTED CHECK ((userpsw='') or (left(userpsw,1)=char(1) and right(userpsw,1)=char(3))) \r\n"
+ "drop table #matablecustom";
if (Api.SqlExec(sqlCommand))
{
Api.SafeCommit(trans);
MercatorUi.Dialogs.Stop("OK");
}
else
{
Api.SafeRollback(trans);
}
}
}
}
Pour une colonne de type varbinary(MAX), il faut remplacer la ligne de cryptage par
dr["userpsw"] = MercatorCryptorEngine.CryptorEngine.MercatorEncryptRsaAes((byte[])dr["userpsw"]);
Et remplacer la seconde ligne du script SQL (qui place la contrainte vérifiant que dorénavant la colonne ne contient que des informations cryptées)
alter table matablecustom add constraint USERPSW_ENCRYPTED CHECK ((USERPSW is null) or (DATALENGTH(USERPSW)=0) or (dbo.IS_BINARY_MERCATORENCRYPTED(USERPSW)=1))