我试过这个:
DECLARE @test varchar(50) = 'test'
INSERT INTO Customer VALUES ('Lucas', 'Test', @test)
但我得到了这个错误:
列/变量'@test'的加密方案不匹配。列/变量的加密方案为(encryption\utype="PLAINTEXT"(,第"3"行附近的表达式希望其为(encription\ype="DENTISTIC",encryptic_algorithm_name="AEAD_AES_256_CBC_HMAC_SHA_256",column_encryptin_key_name="MyCEK",column-encryptit_key_database_name="AlwaysEncrypted"((或更弱(。
我也尝试过这个:
INSERT INTO Customer VALUES ('Lucas', 'Test', 'test')
但我得到了这个错误:
操作数类型冲突:varchar与用(encryption\ype='DENTISTIC',encryption_algorith_name='AEAD_AES_256_CBC_HMAC_SHA_256',column_encrypti_key_name='MyCEK',column-encryptition_key_database_name='AlwaysEncrypted'(加密的varchar(8000(不兼容collation_name='SQL_Latin1_General_CP1_CI_AS'
我的脚本创建了一个加密列:
ALTER TABLE [dbo].Customer
ADD [EncryptedValue] [varchar](50) COLLATE Latin1_General_BIN2
ENCRYPTED WITH(
ENCRYPTION_TYPE = DETERMINISTIC,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
COLUMN_ENCRYPTION_KEY = MyCEK) NOT NULL
CREATE COLUMN ENCRYPTION KEY MyCEK
WITH VALUES
(
COLUMN_MASTER_KEY = MyCMK,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
ENCRYPTED_VALUE = 0x01700000016C006F00630061006C006D0061006300680069006E0065002F006D0079002F003200660061006600640038003100320031003400340034006500620031006100320065003000360039003300340038006100350064003400300032003300380065006600620063006300610031006300284FC4316518CF3328A6D9304F65DD2CE387B79D95D077B4156E9ED8683FC0E09FA848275C685373228762B02DF2522AFF6D661782607B4A2275F2F922A5324B392C9D498E4ECFC61B79F0553EE8FB2E5A8635C4DBC0224D5A7F1B136C182DCDE32A00451F1A7AC6B4492067FD0FAC7D3D6F4AB7FC0E86614455DBB2AB37013E0A5B8B5089B180CA36D8B06CDB15E95A7D06E25AACB645D42C85B0B7EA2962BD3080B9A7CDB805C6279FE7DD6941E7EA4C2139E0D4101D8D7891076E70D433A214E82D9030CF1F40C503103075DEEB3D64537D15D244F503C2750CF940B71967F51095BFA51A85D2F764C78704CAB6F015EA87753355367C5C9F66E465C0C66BADEDFDF76FB7E5C21A0D89A2FCCA8595471F8918B1387E055FA0B816E74201CD5C50129D29C015895CD073925B6EA87CAF4A4FAF018C06A3856F5DFB724F42807543F777D82B809232B465D983E6F19DFB572BEA7B61C50154605452A891190FB5A0C4E464862CF5EFAD5E7D91F7D65AA1A78F688E69A1EB098AB42E95C674E234173CD7E0925541AD5AE7CED9A3D12FDFE6EB8EA4F8AAD2629D4F5A18BA3DDCC9CF7F352A892D4BEBDC4A1303F9C683DACD51A237E34B045EBE579A381E26B40DCFBF49EFFA6F65D17F37C6DBA54AA99A65D5573D4EB5BA038E024910A4D36B79A1D4E3C70349DADFF08FD8B4DEE77FDB57F01CB276ED5E676F1EC973154F86
)
CREATE COLUMN MASTER KEY MyCMK
WITH (
KEY_STORE_PROVIDER_NAME = N'MSSQL_CERTIFICATE_STORE',
KEY_PATH = 'Current User/Personal/f2260f28d909d21c642a3d8e0b45a830e79a1420'
);
不能直接对Encrypted列执行操作。要进行任何类型的操作,都需要一个加密密钥,在这种情况下,它就是列加密密钥。
当您查找列加密密钥时,您可以在";安全性->始终加密的密钥->列加密密钥";。然而,该列加密密钥不能独立地起作用,并且它本身是用";列主密钥";存在于";列主密钥";部分
通常,当DBA将";列主密钥";他们要么使用现有证书的指纹,要么创建一个新证书。但是在创建证书之后,在活动环境中部署时,他们会从证书存储中删除证书。
因此,这意味着一旦他们锁定了表列,他们就会删除键并将其单独保存。现在,Web开发人员可以在查询数据库时使用该证书,并将其安装在Web服务器上。
列主密钥用于加密列加密密钥,列加密密钥又对列进行加密。
所以,你可以在这里做如下。
- 编写用于在加密列中插入或更新值的存储过程
- 编写一个.net Web API来调用该过程
- 安装具有证书指纹的证书,该证书用于在将部署Web API的服务器上创建列主密钥
- 从其他web应用程序或Postman调用API
或者,如果您坚持使用SSMS进行操作,那么您应该在该计算机上为该用户安装创建列主密钥的证书。然后,您需要使用附加连接参数连接数据库;列加密设置=启用";然后通过在单行中声明要传递的变量和值,从查询窗口调用存储过程。有关此方法的更多信息,请访问下面的链接。
使用SSMS 插入和更新加密列
希望这能解决你的问题。