如何用C#实现数据库的加密列?透明数据加密TDE?

来源:这里教程网 时间:2026-02-21 17:28:13 作者:

在C#中实现数据库加密列或使用透明数据加密(TDE),需要区分两种不同的加密层级:一种是应用层的列级加密,另一种是数据库层面的TDE。它们的目标和实现方式不同。

1. 列级加密(应用层加密)

如果你希望在C#应用中对特定的数据列进行加密(例如身份证号、手机号等),可以在写入数据库前加密,读取时解密。这种方式由应用程序控制加密逻辑。

示例:使用AES加密敏感列

步骤:

定义一个加密帮助类,使用AES算法对字符串加密 在保存到数据库前调用加密方法 从数据库读取后调用解密方法

AES加密工具类示例:

public class AesEncryptionHelper { private static readonly byte[] Key = { /* 32字节密钥 */ }; // 应安全存储 private static readonly byte[] IV = { /* 16字节IV */ }; // 初始化向量
public static string Encrypt(string plainText)  
{  
    using (var aes = Aes.Create())  
    {  
        aes.Key = Key;  
        aes.IV = IV;  
        var encryptor = aes.CreateEncryptor(aes.Key, aes.IV);  
        using (var ms = new MemoryStream())  
        {  
            using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))  
            {  
                using (var sw = new StreamWriter(cs))  
                    sw.Write(plainText);  
            }  
            return Convert.ToBase64String(ms.ToArray());  
        }  
    }  
}  
public static string Decrypt(string encryptedText)  
{  
    using (var aes = Aes.Create())  
    {  
        aes.Key = Key;  
        aes.IV = IV;  
        var decryptor = aes.CreateDecryptor(aes.Key, aes.IV);  
        using (var ms = new MemoryStream(Convert.FromBase64String(encryptedText)))  
        {  
            using (var cs = CryptoStream(ms, decryptor, CryptoStreamMode.Read))  
            {  
                using (var sr = new StreamReader(cs))  
                    return sr.ReadToEnd();  
            }  
        }  
    }  
}  

}

使用场景:

// 保存用户信息前加密 string encryptedPhone = AesEncryptionHelper.Encrypt("13800138000"); // 插入数据库 command.Parameters.AddWithValue("@Phone", encryptedPhone);

// 查询时解密
string decryptedPhone = AesEncryptionHelper.Decrypt(reader["Phone"].ToString());

注意:密钥管理很关键,不要硬编码在代码中,建议使用Azure Key Vault、环境变量或配置服务保护密钥。

2. 透明数据加密(TDE, Transparent Data Encryption)

TDE 是数据库引擎级别的加密功能,用于加密整个数据库的数据文件(.mdf)、日志文件(.ldf)和备份文件,防止未经授权的物理访问。

TDE 不是由C#代码直接实现的,而是通过SQL Server或Azure SQL配置的。C#应用无需修改代码即可透明使用。

启用TDE的步骤(以SQL Server为例):

创建数据库主密钥(DMK) 创建证书用于加密 创建数据库加密密钥(DEK) 启用TDE

USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongPassword123!';

CREATE CERTIFICATE MyServerCert WITH SUBJECT = 'My Database Encryption Certificate';

USE YourDatabase;
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER CERTIFICATE MyServerCert;

ALTER DATABASE YourDatabase SET ENCRYPTION ON;

启用后,数据库所有页在写入磁盘前自动加密,读取时自动解密。备份文件也自动加密。

Azure SQL中的TDE

Azure SQL默认支持TDE,在门户中可一键开启,并支持使用客户管理密钥(CMK)与Azure Key Vault集成。

对比总结

列级加密(C#实现)

加密粒度细,仅加密敏感字段 应用层控制,需修改代码 数据库中内容为密文,支持模糊查询困难 适合高敏感字段如身份证、银行卡

TDE(数据库层)

加密整个数据库文件 无需修改C#代码,完全透明 不保护数据在应用中的明文显示 防物理攻击、备份泄露

基本上就这些。根据安全需求选择合适方案,有时两者结合使用更佳。

相关推荐