Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

Crypter des colonnes d'une table custom

0000003093     -      23/06/2022

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.

Zoom
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

Zoom
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))