Versleutelen van kolommen in custom tabellen

0000003093     -      28-06-2022

Verwant met de functionaliteit van versleutelen van kolommen in de database, onderstaande code laat zien hoe men een kolom kan versleutelen die niet bekend is bij Mercator maar wel aanwezig is in de database.

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);
                    }
                }
            }
        }

 

Voor een kolom van het type varbinary(MAX), moet men de lijn met versleuteling aanpassen naar

Zoom
dr["userpsw"] = MercatorCryptorEngine.CryptorEngine.MercatorEncryptRsaAes((byte[])dr["userpsw"]);

 

En men moet ook de 2de lijn van het SQL script vervangen door het volgende (deze plaatst een constraint die voortaan controleert of de kolom versleutelde informatie bevat):

alter table matablecustom add constraint USERPSW_ENCRYPTED CHECK ((USERPSW is null) or (DATALENGTH(USERPSW)=0) or (dbo.IS_BINARY_MERCATORENCRYPTED(USERPSW)=1))