我正在尝试使用 Entity Framework 6 和数据库项目对 SQL 数据库中的某些列进行加密和解密。
我创建了我的主 key :
CREATE COLUMN MASTER KEY [CMK_1]
WITH
(
KEY_STORE_PROVIDER_NAME = N'MSSQL_CERTIFICATE_STORE',
KEY_PATH = N'CurrentUser/my/D4331582F1485517DA1807CF0A5500C........'
)
和我的加密 key :
CREATE COLUMN ENCRYPTION KEY [CEK_1]
WITH VALUES
(
COLUMN_MASTER_KEY = [CMK_1],
ALGORITHM = N'RSA_OAEP',
ENCRYPTED_VALUE = 0x016E00000163007500....
);
而 mt 表是:
CREATE TABLE [dbo].[MyWords]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY,
[MyWord] [NVARCHAR](4) COLLATE Latin1_General_BIN2 ENCRYPTED WITH(ENCRYPTION_TYPE = DETERMINISTIC, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', COLUMN_ENCRYPTION_KEY = [CEK_1]) NOT NULL,
)
GO
数据库创建成功。表和键都存在。
我正在尝试使用 Entity Framework 向数据库添加一个新条目,但出现此错误:
Failed to decrypt a column cipher key using the following key store provider: 'MSSQL_CERTIFICATE_STORE'. The last 10 bytes of the encrypted column encryption key are: 'AF-B3-97-27-5A-BC-33-24-75-FA'. \ R \ nDegumental certificate 'D4331582F1485517DA1807C.....' was not in the 'My' certificate store under the location 'CurrentUser' found.
我不知道为什么。
附言我在连接字符串中添加了启用参数:
Column Encryption Setting = Enabled;
我是不是漏掉了什么?为什么我在 .SaveChanges 上收到此错误? 一点解释会很有帮助! 谢谢!
最佳答案
经过两天的寻找,我找到了答案。问题在于不知道证书。所以我使用 Always Encrypted 生成了证书: https://social.technet.microsoft.com/wiki/contents/articles/37979.working-with-the-always-encrypted-feature-in-sql-server-2016.aspx
然后我去了证书管理器并复制了生成的证书的指纹并在生成主 key 时粘贴它:
KEY_PATH = N'CurrentUser/my/[new_fingerprint]'
并且有效。它将始终在我的本地计算机上加密。我试图备份数据库并在另一台机器上使用它。在我导出/导入证书之前,该列已加密。
关于c# - 使用 Entity Framework 在 sql server 中加密/解密列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49278117/