使用SQL Server 2017,我遵循本文应用始终加密技术:https://www.codeproject.com/articles/1110564/Always-Encrypted-feature-in-sql-server简单地说:
- 创建列主键。
- 创建列加密密钥。
- 加密使用后者的列。
用于步骤1的证书是使用向导生成的,并保存在:
中密钥存储: Windows Certificate Store - Local Machine
我创建了非常简单的控制台应用程序,该应用程序使用EF尝试从我对列进行加密的表中获取数据。
我添加到连接字符串:column encryption setting=Enabled
。
当我尝试获取数据时:
using (MyEntities en = new MyEntities())
{
var x = en.TableHasColEnc.ToList();
}
我得到此错误:
'无法解密列'x'。 无法使用密钥存储提供商解密列加密密钥:" mssql_certificate_store'。加密列加密密钥的最后10个字节是:'xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx'。 证书'...'在证书存储中找不到的"我的"我的" in Centerrip"位置" localmachine"(。验证数据库中"主密钥"定义中的证书路径正确,并且证书已正确导入到证书位置/存储中。 参数名称:MasterKeypath'
我得到的是,正在运行此应用程序的用户无法访问该位置以获取证书,但是为什么?
如果我以admin的范围运行该应用程序。
我打开了 为什么我会遇到此错误以及如何解决?mmc
并检查了Certificates (Local Computer)
,并找到了已在>步骤1中使用的证书。
这个答案帮助我解决了问题:
如何在证书存储中的证书中访问ASP.NET?
这个想法是授予将运行该应用程序的用户(或在Web应用程序的情况下,IIS应用程序池用户(能够读取私钥。
在正确的答案中说明了如何授予IIS用户的权限,您可以为正在运行您的应用程序的人做同样的事情。
更新如果您的应用在一台服务器上,并且数据库在另一台服务器上(因此您的加密证书很可能在DB的服务器上(,则需要导出,然后将该证书从DB的服务器导入到您的应用程序服务器,并为正在运行应用程序的用户提供使用此证书的私钥的权限。