Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储加密密钥的正确方法,可用于跨多台计算机的多个应用程序_C#_Sql Server_Security_Encryption - Fatal编程技术网

C# 存储加密密钥的正确方法,可用于跨多台计算机的多个应用程序

C# 存储加密密钥的正确方法,可用于跨多台计算机的多个应用程序,c#,sql-server,security,encryption,C#,Sql Server,Security,Encryption,下面是一个场景 我们的数据库中存储了敏感数据,如SSN和DOB。 在我们插入记录之前,这些数据是加密的 我们有许多(超过20个)应用程序和web应用程序,它们跨越多台机器和数据中心,需要加密和存储数据,或者检索和解密数据。大多数应用程序都是.Net,但不是全部 目前,我们有一个应用程序正在使用Microsoft TrippleDescriptorServiceProvider(我们将很快使用更新的算法)进行加密/解密。 我们目前将密钥存储在进行加密/解密的类中 这显然是不好的,原因有很多,我相信

下面是一个场景

我们的数据库中存储了敏感数据,如SSN和DOB。
在我们插入记录之前,这些数据是加密的

我们有许多(超过20个)应用程序和web应用程序,它们跨越多台机器和数据中心,需要加密和存储数据,或者检索和解密数据。大多数应用程序都是.Net,但不是全部

目前,我们有一个应用程序正在使用Microsoft TrippleDescriptorServiceProvider(我们将很快使用更新的算法)进行加密/解密。
我们目前将密钥存储在进行加密/解密的类中

这显然是不好的,原因有很多,我相信我们都知道。在任何人惩罚我之前,我没有写这段代码,我继承了它

最后,我需要一个中心位置,在那里我可以安全地存储密钥并快速检索它

需要考虑的事情

  • 不同类型的应用程序(控制台、windows窗体、网站和API)需要访问它
  • 应用程序在不同的计算机上运行,有些应用程序不属于域,并且位于DMZ中。大多数是运行.Net应用程序的windows,但有些运行Linux,是GO应用程序
  • 我们确实有一个中央数据库服务器,但是我们如何安全地存储用于访问密钥的SQL凭据呢
  • 正在运行SQL server 2016 Pro

您是否考虑过使用SQL Server的功能

虽然它本身不是密钥存储机制,但如果您的目标是保护“静止”的数据(即文件系统上的数据库文件和所有备份中的数据),那么这可能提供了一种方法,而无需在各种应用程序之间拆分您自己的加密方法

TDE的设置并不是最复杂的,但要确保您了解证书和密钥的使用方式,并且知道需要备份(并安全存储)什么,以便能够恢复数据并将备份恢复到不同的计算机等

它不会解决您的分布式密钥问题,但您可以取消在每个应用程序中对数据库内外的数据进行加密/解密的要求,并让数据库透明地进行加密/解密

作为另一种选择,您还可以在中央服务器上使用一个单独的TDE安全数据库作为加密密钥的存储,然后所有其他应用程序都可以访问该加密密钥

有了TDE,任何拥有SQL Server凭据的人都可以访问纯文本数据,因此您需要保护服务器的凭据,正如您所提到的

保护凭据

由于您的计算机分布在不同的操作系统和域之间,您可能需要多种不同的方法来保护每台计算机上的凭据(我想您知道这一点)

对于与SQL Server位于同一域(或SQL Server信任的域)上的Windows计算机,您真的无法击败。它们是一个域级别的帐户,无法以交互方式登录,密码非常长且定期变化,并且只能由服务帐户使用。使用这些,您不需要SQL帐户凭据,因为您可以直接向服务帐户授予数据库权限(连接字符串使用“Integrated_Security=True”)

对于不在域上的Windows计算机,存储凭据的合理方法是使用。这样,您就可以将SQL用户名和密码凭据提供给代码(以低权限服务用户的身份运行),然后由DPAPI保护并存储在文件中。这样,只有以该服务用户身份运行的代码才能读取它们。从另一个用户访问文件系统的恶意代码将无法解密它们

至于Linux,对不起,这不是我的专长

证书

更值得深思的是,所有操作系统(至少Windows和Linux)都有保护证书及其私钥的方法,许多框架(如.NET)都有使用证书加密和解密数据的方法。您可能会生成一个证书和私钥(这会为您提供一个非对称密钥对),并将它们安装在您的服务器上


这样,您就可以生成对称密钥(例如,对于3DES或AES),然后使用证书的非对称公钥加密对称密钥。加密的对称密钥可以放在中央数据库或其他地方。只有使用非对称私钥解密对称密钥的应用程序才能使用它来解密数据。

您是否考虑过使用SQL Server的功能

虽然它本身不是密钥存储机制,但如果您的目标是保护“静止”的数据(即文件系统上的数据库文件和所有备份中的数据),那么这可能提供了一种方法,而无需在各种应用程序之间拆分您自己的加密方法

TDE的设置并不是最复杂的,但要确保您了解证书和密钥的使用方式,并且知道需要备份(并安全存储)什么,以便能够恢复数据并将备份恢复到不同的计算机等

它不会解决您的分布式密钥问题,但您可以取消在每个应用程序中对数据库内外的数据进行加密/解密的要求,并让数据库透明地进行加密/解密

作为另一种选择,您还可以在中央服务器上使用一个单独的TDE安全数据库作为加密密钥的存储,然后所有其他应用程序都可以访问该加密密钥

有了TDE,任何拥有SQL Server凭据的人都可以访问纯文本数据,因此您需要保护服务器的凭据,正如您所提到的