在SQL Server或C#中加密数据

Encrypting data in SQL Server or C#

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

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

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

    我使用的是SQL Server 2016和.NET 4.6,但也有其他依赖项,如我希望支持的Reporting Services。-也许"SQL Server 2016总是加密的"方法是可行的吗?你有什么实际经验可以分享吗?

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @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

    我从增加始终加密证书的有效性中借用了一些makecert.exe参数

    编辑2:经过几天的工作,我们决定不使用始终加密的方式进行生产,因为在SSMS中启用了它(并且始终加密参数化)之后,一些查询完全挂起,并且我们看到了许多其他问题即将出现:例如,每个客户端(ASP.NET、SQL Server作业、计划任务、Reporting Services T)询问——对于其中执行联接的每个查询或总是加密的列上的where),该查询需要参数化…即使我们做了很多-我们有更多创造性的查询(非学校书籍查询),不可能以这种方式参数化。然后会发生什么,像是‘%xxx%’等,或者任何我甚至不想考虑的高级TSQL类型。也许我会重新考虑总是加密一个新的解决方案,或者再次拒绝。不是这样的。


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

  • 在SQL Server中使用透明的数据加密功能,它将在静止时加密数据。这意味着数据将由SQL Server在磁盘上加密,数据在客户端和SQL Server之间的网络上以纯文本形式可见,在SQL Server内存中以纯文本形式可见。您可以在此处阅读有关此功能的更多信息。

  • 在SQL Server中使用始终加密的功能,这是一种客户端加密技术,意味着它将在客户端应用程序的驱动程序中加密数据。这意味着数据将在客户机和SQL Server之间的网络上加密,在SQL Server的内存中加密,并在磁盘上加密。如果实现正确,它还可以保护数据不受在SQL Server上获得管理权限的入侵者(基本上,您必须确保加密密钥不存储在SQL Server上,入侵者无法以任何方式访问加密密钥)。我详细地解释了如何做到这一点以及这里始终加密的安全保证。但是,由于SQL Server无法解密数据,因此对加密数据执行哪些操作存在一些限制。您可以在这里阅读关于这些限制的更多信息,https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/always-encrypted-database-engine。您可以在此处了解有关始终加密的更多信息。