You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C#在SQL Server中动态创建Always Encrypted表

当然可以用C#动态创建Always Encrypted表!

完全没问题,思路和创建普通数据表基本一致,核心区别就是在CREATE TABLE的DDL语句里给需要加密的列指定Always Encrypted的属性,同时确保你的数据库连接和权限配置到位。下面我一步步给你讲清楚:

关键前提准备

  • 你的SQL Server数据库已经创建好了列主密钥(Column Master Key)和列加密密钥(Column Encryption Key)——这是Always Encrypted的基础,没有的话得先在数据库里配置好(可以用SSMS或者T-SQL)。
  • 你的C#项目要使用Microsoft.Data.SqlClient NuGet包(别用旧的System.Data.SqlClient,它对Always Encrypted的支持有限)。

具体实现步骤

1. 构造带加密属性的DDL语句

在需要加密的列定义后面,加上ENCRYPTED WITH子句,指定加密密钥、加密类型和算法。比如:

CREATE TABLE Patients (
    PatientId INT PRIMARY KEY,
    Name NVARCHAR(50),
    SSN VARCHAR(11) ENCRYPTED WITH (
        COLUMN_ENCRYPTION_KEY = CEK_Auto1,
        ENCRYPTION_TYPE = DETERMINISTIC,
        ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
    ),
    BirthDate DATE ENCRYPTED WITH (
        COLUMN_ENCRYPTION_KEY = CEK_Auto1,
        ENCRYPTION_TYPE = RANDOMIZED,
        ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
    )
)

注意:DETERMINISTIC加密适合需要做等值查询的列(比如SSN),RANDOMIZED加密安全性更高,但不支持等值、范围查询。

2. 配置支持Always Encrypted的连接字符串

必须在连接字符串里加上Column Encryption Setting=Enabled,这样SqlClient驱动才会自动处理加密和解密逻辑:

string connectionString = "Server=your-server;Database=your-db;Integrated Security=True;Column Encryption Setting=Enabled;";

3. 用C#执行DDL创建表

和执行普通SQL语句的方式一样,用SqlConnection和SqlCommand来执行这段DDL:

using Microsoft.Data.SqlClient;

public static void CreateEncryptedTable()
{
    string connectionString = "Server=your-server;Database=your-db;Integrated Security=True;Column Encryption Setting=Enabled;";
    string createTableSql = @"
        CREATE TABLE Patients (
            PatientId INT PRIMARY KEY,
            Name NVARCHAR(50),
            SSN VARCHAR(11) ENCRYPTED WITH (
                COLUMN_ENCRYPTION_KEY = CEK_Auto1,
                ENCRYPTION_TYPE = DETERMINISTIC,
                ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
            ),
            BirthDate DATE ENCRYPTED WITH (
                COLUMN_ENCRYPTION_KEY = CEK_Auto1,
                ENCRYPTION_TYPE = RANDOMIZED,
                ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
            )
        )";

    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand(createTableSql, conn))
        {
            cmd.ExecuteNonQuery();
            Console.WriteLine("带Always Encrypted的表创建成功!");
        }
    }
}

一些要注意的坑

  • 确保执行代码的用户有读取列主密钥的权限,不然驱动无法获取密钥来处理加密。
  • 如果是用Azure Key Vault存储列主密钥,还要确保你的应用有访问Key Vault的权限(比如通过服务主体)。
  • 不要手动拼接用户输入到DDL语句里,避免SQL注入——尽量用参数化,但DDL本身参数化有限,所以要严格校验输入。

内容的提问来源于stack exchange,提问作者Hyder Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:16:54