加密SQL Server或C#中的数据

时间:2017-07-10 10:30:03

标签: c# sql-server windows security encryption

我正在研究如何加密Web服务器上的选定用户数据字段,并希望了解如何获得最佳结果的建议。例如,假设用户输入了他/她的名字姓氏电子邮件社会安全号码;那个:

  1. 管理员需要能够查看此信息。
  2. 服务器上的进程需要使用信息
  3. ...但是如果数据库(或备份)被盗,则信息被加密且无用。

    我想,有一种方法是生成私钥+公钥,将其存储到Windows证书存储区中,将其标记为Not Exportable(当然保留备份),然后在应用程序层中使用它在需要时加密/解密字段。

    我正在使用SQL Server 2016和.NET 4.6,但也有其他依赖项,例如我想支持的Reporting Services。 - 可能是“SQL Server 2016始终加密”的方式吗?您是否有任何实际经验可以分享使用它?

    我想如果入侵者获得了服务器的管理控制权(Windows 2016 IIS + SQL Server组合),那么就没有太多可以做的了。或者是吗?

    编辑:我决定使用内置于SQL Server 2016的Always Encrypted。这就是我最终生成主密钥的方法,然后我安装在本地计算机证书存储区中,然后设置作为SQL Server中的列主密钥(右键单击DB>安全>始终加密密钥>列主密钥)。

    @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
    

    我从Increase validity of Always Encrypted Certificate

    借用了一些makecert.exe参数

    编辑2 :经过几天的处理后,我们决定不再使用Always Encrypted进行制作,因为在SSMS(以及始终加密参数化)中启用后,一些查询完全挂起,我们看到很多其他问题出现了:例如,每个客户端(ASP.NET,SQL Server作业,计划任务,Reporting Services任务 - 以及那里的每个查询在Always Encrypted上执行JOIN或WHERE列),该查询需要参数化...即使我们做了很多 - 我们有更多的创意查询(非学校图书查询),这是不可能以这种方式参数化。然后LIKE'%xxx%'等会发生什么,或者我甚至不想考虑任何类型的高级TSQL。也许我会重新考虑Always Encrypted以获得新的解决方案,或者再次拒绝。不是这样。

1 个答案:

答案 0 :(得分:3)

有两种方法可以实现这一目标,

  1. 在SQL Server中使用透明数据加密功能,该功能将对其余数据进行加密。这意味着数据将由SQL服务器在磁盘上加密,数据在客户端和SQL服务器之间的网络上以纯文本显示,并且在SQL服务器的内存中以纯文本显示。您可以详细了解此功能here

  2. 在SQL Server中使用Always Encrypted功能,这是一种客户端加密技术,这意味着它将加密客户端应用程序驱动程序中的数据。这意味着数据将在客户端和SQL服务器之间的网络上加密,它在SQL服务器的内存中加密,并在磁盘上加密。如果正确实施,它还可以保护数据免受入侵者的侵害,该入侵者获得SQL Server的管理员权限(基本上,您必须确保加密密钥不存储在SQL Server上,并且入侵者无法以任何方式访问加密密钥)。我将详细介绍如何执行此操作以及Always Encrypted here提供的安全保障。但是,由于SQL Server无法解密数据,因此对可以对加密数据执行的操作存在一些限制。您可以在此处详细了解这些限制,https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/always-encrypted-database-engine。您可以详细了解有关始终加密的here