我正在尝试使用带有.NET Core的SQL Server 2016的Always Encrypted功能,并且似乎无法使用(还).试图Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider从Nuget 导入,我得到一个错误,说明它不兼容:
包Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider 1.0.201501028与netstandard1.6不兼容(.NETStandard,Version = v1.6)
有关如何/在何处获得兼容版本的任何想法?
我试图使用SQL Server 2016中的"始终加密"功能来加密某些列.我使用这篇文章作为指导,在SSDT中将列设置为加密.
那部分没问题,当我尝试从应用程序查询数据时出现错误.根据文档,我需要添加:
column encryption setting=enabled
Run Code Online (Sandbox Code Playgroud)
到我的连接字符串.实体框架核心似乎不支持此功能.我收到此错误:
不支持列加密设置=启用
我也尝试使用SqlConnectionStringBuilder构建字符串,并且没有添加该设置的功能.它确实出现在.NET 4.6中.
那么,是否有人知道使用Always Encrypted从.NET Core应用程序连接到SQL服务器实例的方法?
sql-server entity-framework-core sql-server-2016 asp.net-core always-encrypted
我遇到的问题是始终加密以与Entity Framework一起玩得很好.
我正在瞄准.Net 4.6.1,已启用Column Encryption Setting=Enabled我的连接字符串,我可以成功拨打电话并使用接收解密的内容
var results = dbContext.EncryptedTable.ToList()
Run Code Online (Sandbox Code Playgroud)
EncryptedTable有1列使用确定性加密,数据类型为Varchar(Max).
DbContext有CodeFirst支持
Property(x => x.EncryptedColumn)
.HasColumnName("EncryptedColumn").IsRequired().IsUnicode(false);
Run Code Online (Sandbox Code Playgroud)
一旦我开始使用包含在我的dbContext上的东西开始变坏.
这有效
var id = Guid.Parse("123-456-789");
var result = dbContext
.TableA
.Include(x => x.EncryptedTable)
.FirstOrDefault(x => x.id == id);
Run Code Online (Sandbox Code Playgroud)
抛出错误:
Operand type clash: varchar is incompatible with varchar(max) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256',
var id = Guid.Parse("123-456-789");
var result = dbContext.TableA
.Include(x => x.TableB)
.Include(x => x.EncryptedTable)
.FirstOrDefault(x => x.id == id);
Run Code Online (Sandbox Code Playgroud)
在2个调用中执行SQL配置文件可以看到第2个调用失败exec sp_describe_parameter_encryption.
EF是否支持此方案并始终加密?
使用 Visual Studio 数据库项目 (SSDT),我向现有表添加了一个新列。我正在使用 Always Encrypted 来加密各个列。当我添加列并尝试发布时,我在 Visual Studio 中看到一个弹出窗口,显示“值不能为空。参数名称:reportedElement”。
如果我不加密该列,它就可以工作。如果我从表中清除现有数据,它就可以工作。但是只是尝试添加一个新的可为空的加密列并不会发布。它甚至不会生成将应用的脚本。
我运行了 daxFX 和 SSDT 日志记录并使用 Windows 事件查看器查看了日志,但我只看到相同的错误“值不能为空。参数名称:reportedElement”。
这就是添加的列定义的样子。
[MyNewColumn] INT ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [DefaultColumnEncryptionKey], ENCRYPTION_TYPE = DETERMINISTIC, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL
Run Code Online (Sandbox Code Playgroud)
我希望 Visual Studio 能够成功发布,添加我新的可为空的加密列,但实际行为是一个弹出窗口,指出“值不能为空。参数名称:reportedElement”。
sql-server sql-server-data-tools always-encrypted visual-studio-2017
我们有一个使用Always Encrypted的SQL Server 2016数据库。我们最近发布的ASP.net网站尝试从该数据库中提取数据,当它出现时,我们将收到此错误:
Error: Failed to decrypt column 'EnSSd'. Failed to decrypt a column encryption key using key store provider: 'MSSQL_CERTIFICATE_STORE'. The last 10 bytes of the encrypted column encryption key are: 'B8-48-B3-62-90-0B-1D-A6-7D-80'. Certificate with thumbprint '97B0D3A64CADBE86FE23559AEE2783317655FD0F' not found in certificate store 'My' in certificate location 'CurrentUser'. Verify the certificate path in the column master key definition in the database is correct, and the certificate has been imported correctly into the certificate location/store. Parameter name: masterKeyPath
现在我们知道这意味着证书尚未放置在服务器上的正确位置。在开发过程中,我们只是将证书放在“个人证书存储”下的“证书”管理单元中就可以了,但是现在该站点已经发布,我们尝试在Web服务器上进行相同的操作,但是它不起作用(我们有点想通了)不会)。
网站上启用了匿名身份验证,匿名用户身份为IUSR。ASP.NET模拟已禁用。
放置证书的适当位置在哪里? …
我在我的Web应用程序中执行始终加密,它由窗口服务托管的WCF服务插入数据.我在将数据插入加密列时遇到以下错误.无法使用密钥库提供程序解密列加密密钥:'MSSQL_CERTIFICATE_STORE'.加密列加密密钥的最后10个字节是:'64-56-87-3B-EC-2E-11-9D-2A-B5'.证书位置'CurrentUser'中的证书存储'My'中找不到指纹'A0D10777759BBD947EEA6F3F5D1A7989514C45F0'的证书.验证数据库中列主密钥定义中的证书路径是否正确,并且证书已正确导入证书位置/存储.参数名称:masterKeyPath
是否可以通过与 SSMS 不同的方式生成 ENCRYPTED_VALUE?我喜欢为所选列启用“始终加密”功能,但我想知道如何通过未知密钥加密数据。
在我看来,总应该有一种方法可以在不连接到 azure key Vault 的情况下解密数据(就像我理解的 SQL Server 使用对称 AES256 加密数据一样)。
CREATE COLUMN ENCRYPTION KEY MyCEK
WITH VALUES
(
COLUMN_MASTER_KEY = MyCMK,
ALGORITHM = 'RSA_OAEP',
ENCRYPTED_VALUE = (i am talking about this value)
);
Run Code Online (Sandbox Code Playgroud) sql-server encryption azure-sql-database azure-keyvault always-encrypted
自EF Core 2.1起,尚不支持始终加密的SQL Server功能.
我正在使用SQL Server 2016和Azure SQL,并且所有客户端都是基于Windows的.
通常,这样做是为了返回与列表匹配的数据集:
string[] ssn = { "123456789", "987654321" };
var result_set = db.employee.Where(w => ssn.Contains(w.SSN)).ToList();
Run Code Online (Sandbox Code Playgroud)
但是,当通过“始终加密”对SSN列进行加密时,会发生以下错误:
SqlException:使用(encryption_type ='DETERMINISTIC',encryption_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name ='CEK_SSN',column_encryption_key_database_name ='var'('in'='In''和'in'到1'的加密的数据类型varchar(9)进行排序。
一般而言,由于单个值有效,因此设置正确:
string ssn = "123456789";
var result_set = db.employee.Where(w => w.SSN == ssn).ToList();
Run Code Online (Sandbox Code Playgroud)
我正在寻找实现此客户端的最佳方法。我知道这种解决方法可以解决问题,但是它需要整个表才能通过:
var result_set = db.employee.ToList().Where(w => ssn.Contains(w.SSN));
Run Code Online (Sandbox Code Playgroud)
我已经看到了一些示例(与.NET的较早版本有关,不一定与“始终加密”有关),其中有些花哨的扩展名创建了一堆“或”。我还知道,使用表变量,我可以使用存储过程做一些棘手的事情。但是我确实在寻找一种优雅的方式来实现此目的,最好是通过LINQ,但至少是在客户端代码中。我正在确定“始终加密”是否会对新项目带来任何无法逾越的障碍,因此我愿意接受任何建议。
我已经检查了 pgcrypto 扩展的实现。它不会使用 EF Core 自动加密和解密数据,并且需要单独的函数。而 SQL Server 的“始终加密”功能可以透明地完成此操作,无需进行太多代码更改。
那么 PostgreSQL 中也有类似的功能吗?
encryption postgresql entity-framework-core asp.net-core always-encrypted
always-encrypted ×10
sql-server ×5
c# ×3
encryption ×3
asp.net-core ×2
linq ×2
.net-core ×1
asp.net ×1
iis ×1
iis-7.5 ×1
postgresql ×1
wcf ×1