我正在处理数百万行必须加密并插入sql server的数据。由于有很多数据可以使用,我使用SqlBulkCopy来推送数据。对于SqlBulkCopy,我使用数据表来保存数据,在将数据添加到数据表之前,我使用的是加密数据。 AESCryptoServiceProvider,一旦批量复制完成,加密数据就会进入sql server。现在,一旦加密数据在服务器中,有没有办法解密sql server上的数据。我知道使用c#解密很容易,但我有一个用例,人们想在sql server中解密数据并执行一些操作。
以下是代码,请指出正确的方向。
AES
private const string AesIV = @"!QAZ2WSX#EDC4RFV";
private const string AesKey = @"5TGB&YHN7UJM(IK<";
AES Encryption
public string Encrypt(string text)
{
// AesCryptoServiceProvider
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.BlockSize = 128;
aes.KeySize = 128;
aes.IV = Encoding.UTF8.GetBytes(AesIV);
aes.Key = Encoding.UTF8.GetBytes(AesKey);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
// Convert string to byte array
byte[] src = Encoding.Unicode.GetBytes(text);
// encryption
using (ICryptoTransform encrypt = aes.CreateEncryptor())
{
byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length);
// Convert byte array to Base64 strings
return Convert.ToBase64String(dest);
}
}
BCP
public void bcp(Program p){
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlCon"].ToString()))
{
SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
bc.DestinationTableName = "tbl";
bc.ColumnMappings.Add("id", "id");
bc.ColumnMappings.Add("info", "info");
bc.ColumnMappings.Add("desc", "desc");
bc.BulkCopyTimeout = 300;
bc.BatchSize = 3000000;
con.Open();
bc.WriteToServer(p.dt);
bc.Close();
con.Close();
}
}
Data parsing and encryption
public void dp(Program p) {
using (var reader = new StreamReader(@"C:\data.txt"))
{
string h = reader.ReadLine();
DataRow row;
int i = 0;
while (i< 3000000)
{
//insert into database
string[] data = reader.ReadLine().Split(',');
row = p.dt.NewRow();
row["id"] = Convert.ToInt32(data[0]);
row["info"] = data[1].ToString();
row["desc"] = p.Encrypt(data[2].ToString());
Console.WriteLine(row["id"]);
p.dt.Rows.Add(row);
i++;
}
}
}
现在我已经加密了数据,我试图看看我是否可以解密SQL Server上的数据,我试图看看我是否使用AES_128来解密它。
另一种选择是加密列并且插入必须逐行,这将是开发和维护的头痛。
答案 0 :(得分:1)
查看有关SQL CLR的这篇文章。 http://msdn.microsoft.com/en-us/library/ms254498(v=vs.110).aspx