Comment remplir des colonnes chiffrées dans une base de données à l'aide de SqlBulkCopy?

c# database encryption sqlbulkcopy sql-server

Question

J'utilise SqlBulkCopy et System.Data.Datatable pour insérer des données dans ma base de données. Je fais quelque chose comme ça:

var table = new DataTable();

// Creating table schema
var newRow = table.NewRow();
newRow["FirstName"] = Parser.Parse(values[0])
newRow["LastName"] = Parser.Parse(values[1])
...
newRos["SSN"] = //here I need to encrypt by db certificate value[5] before set it to this row value

Et une copie simple en code db:

using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
{
    bulkCopy.BatchSize = 100;
    bulkCopy.DestinationTableName = "dbo.Member";
    try
    {    
        bulkCopy.WriteToServer(table);
    }
    catch (Exception)
    {
        transaction.Rollback();
        connection.Close();
        throw;
    }
}

Bien sûr, je peux définir une colonne cryptée ultérieurement à l'aide d'une procédure stockée dans la base de données, mais je souhaite le faire en une seule transaction. Est-il possible de chiffrer string valeur de string utilisant mon certificat de la base de données en code?

Merci d'avance!

Réponse acceptée

À mon avis, vous pouvez choisir l’une des options suivantes (qui devraient être faciles à mettre en œuvre):

Faites le cryptage dans votre code C #

Comme vous disposez de toutes les données, vous pouvez effectuer le cryptage à l'aide des classes pertinentes du .NET Framework. Vous pouvez le tester et vous assurer d'obtenir le même résultat.

Utiliser le déclencheur AFTER INSERT

Après avoir ajouté la valeur, vous allez modifier et ajouter les données cryptées. Le déclencheur fera partie de la même transaction. Utilisez simplement l'instruction CREATE TRIGGER pour créer un nouveau déclencheur, vérifiez si la valeur est NULL, puis insérez la valeur chiffrée à l'aide d'instructions SQL.

Par exemple:

CREATE TRIGGER [dbo].[myTrigger]
   ON  [dbo].[Members] 
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    UPDATE Members
    SET [EncryptedSSN] = EncryptByKey(Key_GUID('SSN_Key'), inserted.SSN)
    FROM inserted 
    INNER JOIN dbo.Members On inserted.id = Members.id
END 

J'espère que cela t'aides.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi