C# 在SQL Server或C中加密数据#

C# 在SQL Server或C中加密数据#,c#,sql-server,windows,security,encryption,C#,Sql Server,Windows,Security,Encryption,我正在研究如何在web服务器上加密选定的用户数据字段,并希望获得关于如何实现最佳结果的建议。例如,假设用户输入他/她的名字、姓氏、电子邮件和社会保险号码;而且: 管理员需要能够查看此信息 服务器上的进程需要使用这些信息 …但如果数据库(或备份)被盗,则信息将被加密且无用 我想,一种方法是生成一个私钥+公钥,将其存储到Windows证书存储中,将其标记为不可导出(当然要保留一个备份),然后在应用层中根据需要对字段进行加密/解密 为此,我使用SQL Server 2016和.NET 4.6,但也有其

我正在研究如何在web服务器上加密选定的用户数据字段,并希望获得关于如何实现最佳结果的建议。例如,假设用户输入他/她的名字、姓氏、电子邮件和社会保险号码;而且:

  • 管理员需要能够查看此信息
  • 服务器上的进程需要使用这些信息
  • …但如果数据库(或备份)被盗,则信息将被加密且无用

    我想,一种方法是生成一个私钥+公钥,将其存储到Windows证书存储中,将其标记为不可导出(当然要保留一个备份),然后在应用层中根据需要对字段进行加密/解密

    为此,我使用SQL Server 2016和.NET 4.6,但也有其他依赖项,如我希望支持的Reporting Services。-或许“SQL Server 2016始终加密”是一条路吗?关于使用它,你有什么实际经验可以分享吗

    我猜,如果入侵者获得了服务器的管理控制权(Windows 2016 IIS+SQL server组合),那么就没有什么可以做的了。还是这样

    编辑:我决定使用SQL Server 2016中内置的始终加密。这就是我最终生成主密钥的原因,然后将其安装在本地计算机证书存储中,然后在SQL Server中设置为列主密钥(通过简单的SSMS右键单击DB>安全>始终加密密钥>列主密钥)

    我从中借用了一些makecert.exe参数


    编辑2:经过几天的工作,我们决定不使用Always Encrypted开始生产,因为在SSMS中启用它(以及Always Encrypted Parameterization)后,一些查询完全挂起,我们看到许多其他问题出现:例如,每个客户端(ASP.NET、SQL Server作业、计划任务、Reporting Services任务——以及其中的每个查询在始终加密的列上执行联接或WHERE),该查询需要参数化……尽管我们经常这样做,但我们有更具创造性的查询(非教科书查询)这是不可能以这种方式进行参数化的。然后,像“%xxx%”等或任何我不想考虑的高级TSQL类型会发生什么。也许我会重新考虑为新解决方案始终加密,或者再次考虑不。这不是它。

    有两种方法可以实现这一点

  • 在SQL server中使用透明数据加密功能,该功能将加密静态数据。这意味着SQL server将在磁盘上加密数据,数据在客户端和SQL server之间的网络上以纯文本显示,在SQL server内存中以纯文本显示。您可以阅读有关此功能的更多信息。

  • 在SQL server中使用始终加密功能,这是一种客户端加密技术,意味着它将加密客户端应用程序驱动程序中的数据。这意味着数据将在客户端和SQL server之间的网络上加密,在SQL server内存中加密,并在磁盘上加密。如果实施正确地说,它还可以保护数据免受在SQL server上获得管理员权限的入侵者的攻击(基本上,您必须确保加密密钥未存储在SQL server上,入侵者无法以任何方式访问加密密钥)。我将详细解释如何执行此操作以及Always Encrypted提供的安全保证。但是,由于SQL server无法解密数据,因此对加密数据执行的操作存在一些限制。您可以在此处阅读有关这些限制的更多信息。您可以了解有关Always Encrypted的更多信息


  • 您可以在服务器上使用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