Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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#_Wpf_Encryption Symmetric - Fatal编程技术网

C# 试图了解在应用程序中保持凭据安全的概念和最佳做法(以及代码?)

C# 试图了解在应用程序中保持凭据安全的概念和最佳做法(以及代码?),c#,wpf,encryption-symmetric,C#,Wpf,Encryption Symmetric,一般来说,有大量可用于加密的资料,我一直在通读。但这个问题不是关于实际的加密…而是如何保护我用来加密的东西 我觉得我试图解决的问题很简单:我的应用程序需要连接到网站上的MySQL数据库以获取一些信息。这需要凭据才能登录到数据库 应用程序需要准备好这些凭据,这意味着要安全地存储它们,例如在app.config中。我可以很容易地保存它们。我甚至尝试过这样做,使用aspnet_regiis-pef将它们存储到存储位置,但这似乎是一个不可移植的解决方案(例如,在我的开发PC上工作,在另一台计算机上解密失

一般来说,有大量可用于加密的资料,我一直在通读。但这个问题不是关于实际的加密…而是如何保护我用来加密的东西

我觉得我试图解决的问题很简单:我的应用程序需要连接到网站上的MySQL数据库以获取一些信息。这需要凭据才能登录到数据库

应用程序需要准备好这些凭据,这意味着要安全地存储它们,例如在
app.config
中。我可以很容易地保存它们。我甚至尝试过这样做,使用
aspnet_regiis-pef
将它们存储到存储位置,但这似乎是一个不可移植的解决方案(例如,在我的开发PC上工作,在另一台计算机上解密失败)。所以,如果我错了,那就让这成为我的问题:这怎么可能让我失望呢

否则,我的问题是:我应该如何保护用于加密凭据的密钥?是否有一个既定的最佳做法,可以使密钥对应用程序可用,同时仍以某种方式保护它?

您不能隐藏机密

实际上,你无法确保你分发的任何东西。您的连接字符串在app.config中分发给数百万客户,或者至少可以复制数百万次。您的加密算法可能非常复杂,但您必须至少在.net应用程序中包含解密代码;可以很容易地反编译。黑客所要做的就是找出如何/在哪里存储密钥。如果他们的用户没有提供它作为登录过程的一部分,那么您就不能真正保护连接

在web应用程序世界中,我们使用应用程序池服务帐户凭据对web.config中的连接字符串进行加密;只有应用程序池服务帐户才能读取它。网站用户永远无法访问web.config,如果他们访问了,DMZ和数据库服务器之间的防火墙将阻止他们尝试连接。在客户机-服务器应用程序中,您缺少任何这些保护措施


理想情况下,您可以根据最终用户的windows帐户凭据或用户名/密码向其提供SQL Server登录;您保护的是他们的SQL帐户,而不是尝试连接的能力。这在intranet场景中相当安全,因为SQL Server可以将身份验证锁定等委托给Windows Server,从而允许您执行基于三次攻击的登录策略;但是你无法确保连接尝试的安全-只有连接尝试的成功。

老实说,你不会有一个安全的方法来做你想做的事情-你分发应用程序的任何人都可以反编译并检查你发送给他们的内容。从字面上说,任何安全方案,你可以想出,攻击者可以简单地读取代码

相反,我认为您应该在这方面采取一些次要的安全措施(使用一些直接的硬编码密钥加密来阻止不经意间/好奇的人,知道您不会阻止一个有决心的攻击者),而应该尽可能地将重点放在锁定SQL端上。您通过应用程序分发的帐户凭据?为它提供执行其任务所需的最少存储过程,然后将其从所有其他表/视图等中锁定。以应用程序的帐户用户身份连接到SQL数据库,并尝试查看是否可以执行任何恶意操作-篡改表数据、丢弃对象、,etc-然后采取措施缓解/消除这些漏洞


如果这还不够,你的下一个最佳选择就是编程一个中间层。创建一个web服务,让它成为连接到SQL的服务。WPF应用程序根本不与SQL挂钩,必须通过web服务获取/更改/等数据。但重要的是要认识到,攻击者仍然可以篡改您的数据——他们可以直接调用您的web服务,而不是通过WPF应用程序。你得到的唯一好处是攻击者没有SQL登录。

为什么你需要在一台机器上加密,在另一台机器上取消加密?@miliesmith我不明白。此应用程序将在许多不同的机器上使用。数据最初是在某处加密的,对吗?解密的地方总是在其他地方。啊,我说的是app.config部分。当app.config有一个加密部分时,你是在机器之间传输它,还是我读错了?@miliesmith Yes,app.config将随应用程序一起提供。这是一个WPF桌面应用程序。这样一来,每台新安装的计算机上都已经有了它,我想你必须在每台计算机上对它进行加密,或者找到另一种方法向它们获取敏感信息。在您的第二个加密链接中提到的提供者是DataProtectionConfigurationProvider,它使用DPAPI,不能跨机器移植。我已经读了足够多的书,知道您所说的至少大部分是正确的。我希望这是一个让用户自己登录的案例,但不是那种登录或那种数据。我想我毕竟是在“寻找另一条路”的地方。好建议。我已经为此准备了一个最低限度的账户,以减轻在其他一切都失败时造成的损失。