c# - 如何将值插入到列始终加密的 sql 2016 中的表中?

标签 c# sql-server entity-framework always-encrypted

我使用列加密对 sql 2016 表中的几列进行了加密。现在我想将数据插入该表。我尝试创建一个存储过程并使用参数执行该过程,但出现以下错误。

Encryption scheme mismatch for columns/variables '@lastName'. The encryption scheme for the columns/variables is (encryption_type = 'PLAINTEXT') and the expression near line '0' expects it to be (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'BROps_TestDB') (or weaker).

另外,我有一个现有的应用程序,其中使用 SQL 2008 中的 Entity Framework 将值插入到表中(我们正在尝试将其升级到 SQl 2016 以实现始终加密功能)。 那么,是否有任何标志或任何方法可以让我们在代码更改最少的情况下将数据插入 SQL 2016(列加密)?

我已经给出了示例存储过程代码和该存储过程的执行。

    CREATE PROCEDURE dbo.AddCustomer
      @CustomerID int,
      @FirstName nvarchar(25),
      @LastName nvarchar(25),
      @SIN nvarchar(11),
      @CreditCardNumber nvarchar(25),
      @EmailAddress nvarchar(50),
      @PhoneNumber nvarchar(25),
      @TerritoryID int
    AS
    BEGIN
     INSERT INTO [dbo].[Customers]
               ([CustomerID]
               ,[FirstName]
               ,[LastName]
               ,[SIN]
               ,[CreditCardNumber]
               ,[EmailAddress]
               ,[PhoneNumber]
               ,[TerritoryID])
         VALUES
               (@CustomerID,
               @FirstName,
               @LastName,
               @SIN,
               @CreditCardNumber,
               @EmailAddress,
               @PhoneNumber,
               @TerritoryID)
    END 

----------------------------------------
    DECLARE @CustomerID int,
    @FirstName nvarchar(25),
    @LastName nvarchar(25),
    @SIN nvarchar(11),
    @CreditCardNumber nvarchar(25),
    @EmailAddress nvarchar(50),
    @PhoneNumber nvarchar(25),
    @TerritoryID int
    SET @CustomerID = 1
    SET @FirstName = 'David'
    SET @LastName = 'Postlethwaite'
    SET @SIN = '12345-3-ee-3'
    SET @CreditCardNumber = '1111-1233-1231-1233'
    SET @EmailAddress = 'david@clunyweb.co.uk'
    SET @PhoneNumber = '406555'
    SET @TerritoryID = 1
    execdbo.AddCustomer @CustomerID,@FirstName,@LastName,@SIN,@CreditCardNumber,@EmailAddress,
    @PhoneNumber,@TerritoryID

最佳答案

为了直接从 SSMS 将数据插入加密列,您需要将 Parameterization for Always Encrypted 设置为 True

但是 SSMS 2016 不支持此功能,因此您需要安装较新版本的 SSMS,可以找到 here .

获得 SSMS 17.0 后,您需要在连接到实例时为连接启用列加密。

为了将数据插入到指定的加密列中,当您打开一个新的查询窗口时,请执行以下操作:

  • 查询菜单中选择查询选项
  • 高级中,选择为 Always Encrypted 启用参数化

enter image description here

现在您将能够从 SSMS 直接将数据插入表中。

为了以纯文本形式查看加密列值,您需要启用 列加密设置。为此,请执行以下操作:

  • 连接到服务器对话框中
  • 选择选项
  • 转到其他连接参数
  • 输入 Column Encryption Setting = Enabled

enter image description here

关于c# - 如何将值插入到列始终加密的 sql 2016 中的表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44657557/

相关文章:

c# - 使用 C# 中的 post 请求上传到 box.net

c# - 当我的复合根引用数据层时,我的 DI 架构是否正确?

C# 单元测试打开 Window.xaml

javascript - 有关更改排队/后端数据库更新的文本

sql - 是否可以使用 SQL 将身份添加到 GROUP BY?

c# - 替换为通配符

SQL 服务器 : connect two results with specific row

c# - 如何为帖子添加标签?

c# - EDMX 生成 Nullable bool 而不是 bool

c# - 在存储库中模拟 DbSet<TEntity>