C# 在SQL Server或C中加密数据#
我正在研究如何在web服务器上加密选定的用户数据字段,并希望获得关于如何实现最佳结果的建议。例如,假设用户输入他/她的名字、姓氏、电子邮件和社会保险号码;而且:C# 在SQL Server或C中加密数据#,c#,sql-server,windows,security,encryption,C#,Sql Server,Windows,Security,Encryption,我正在研究如何在web服务器上加密选定的用户数据字段,并希望获得关于如何实现最佳结果的建议。例如,假设用户输入他/她的名字、姓氏、电子邮件和社会保险号码;而且: 管理员需要能够查看此信息 服务器上的进程需要使用这些信息 …但如果数据库(或备份)被盗,则信息将被加密且无用 我想,一种方法是生成一个私钥+公钥,将其存储到Windows证书存储中,将其标记为不可导出(当然要保留一个备份),然后在应用层中根据需要对字段进行加密/解密 为此,我使用SQL Server 2016和.NET 4.6,但也有其
编辑2:经过几天的工作,我们决定不使用Always Encrypted开始生产,因为在SSMS中启用它(以及Always Encrypted Parameterization)后,一些查询完全挂起,我们看到许多其他问题出现:例如,每个客户端(ASP.NET、SQL Server作业、计划任务、Reporting Services任务——以及其中的每个查询在始终加密的列上执行联接或WHERE),该查询需要参数化……尽管我们经常这样做,但我们有更具创造性的查询(非教科书查询)这是不可能以这种方式进行参数化的。然后,像“%xxx%”等或任何我不想考虑的高级TSQL类型会发生什么。也许我会重新考虑为新解决方案始终加密,或者再次考虑不。这不是它。有两种方法可以实现这一点
您可以在服务器上使用TDE并通过SSL连接以保护线路上的数据。这是正确的,但需要注意的是,如果SQL server遭到破坏,即如果入侵者获得SQL server的管理员访问权限,则上述方法将无法保护数据,因为数据将以明文形式显示在SQL server的内存中。谢谢!我有一个shared SQL+IIS组合,所以我猜它不会是超级安全的(将密钥存储在同一台机器上)——但它仍然会被加密;而且比不加密要好。不过,我认为生成一个.PFX(使用makecert和pvk2pfx)是明智的,然后将其导入到服务器的LocalMachine\Personal存储中,并通过创建列主密钥引用它。但是,现在,当尝试使用该主密钥创建列加密密钥时,SQL server失败,表示找不到证书。这里是否缺少一些权限?通过使用SSMS UI而不是CREATE语句(我想肯定是指纹写错了)。无论如何,我已经编辑了我的问题,以了解如何设置始终加密。嗨,Fredrik,为了将来的参考,我在这里解释了如何使用powershell创建主密钥证书。
@echo off
echo creating certificate (you might want to set a password on this)...
makecert.exe -n "CN=MyCompany Always Encrypted Master Key 2017" -r -eku 1.3.6.1.5.5.8.2.2,1.3.6.1.4.1.311.10.3.11 -sky exchange -sp "Microsoft Enhanced RSA and AES Cryptographic Provider" -sy 24 -len 2048 -a sha256 -e 01/01/2040 -sv MyCompanyAlwaysEncryptedMasterKey2017.pvk MyCompanyAlwaysEncryptedMasterKey2017.cer
echo merging to pfx (please check to export private key and set a password)...
pvk2pfx -pvk MyCompanyAlwaysEncryptedMasterKey2017.pvk -spc MyCompanyAlwaysEncryptedMasterKey2017.cer
echo done! install your new .pfx into the localmachine certificate store and create a reference to it in sql server!
echo note, backup the .pfx - the certificate private key is marked as non-exportable once installed into the certificate store.
pause