Net Core Web API 2.2保护敏感数据

时间:2019-02-26 18:38:57

标签: c# security asp.net-core asp.net-core-webapi .net-core-2.2

我正在开发.Net Core Web API 2.2项目,并尽力保护它。此应用程序将连接到SQL数据库,并且将从服务器发送电子邮件,因此,我想弄清楚什么是保护敏感数据(例如连接字符串,数据库密码甚至SMTP的电子邮件密码)的好方法帐户)。

我了解到,将密码以纯文本格式存储在文件中的某个位置是不明智的做法,最佳实践之一是使用某些 Microsoft Azure 功能(在其中提供一些密钥,返回您的实际密码),我还没有使用过。此外,我没有Azure的任何订阅,并且暂时我不希望这样做。

一些人提出的另一种方法是将所有密码存储到环境变量中,并在应用程序中简单地引用它。我目前正在探索此选项,因为我的应用程序将托管在我无法直接访问的“虚拟Windows服务器”上,因此很难(没有直接访问权限)到达那里并设置环境变量(甚至不确定如果可能的话)。

最后,到目前为止,最好的选择(以防无法使用上述变量)是实际上将连接和密码直接存储到 appsettings.json 文件中,但要进行哈希处理它们并在运行时解密。对我来说,这种选择肯定是可行的。但是我想问(即使这可能是很主观的)你们,这是否是正确的方法,或者我错过了某些可以帮助我更好地保护我的应用程序免受外部威胁的东西。

由于我现在真的不知道如何进行,所以任何建议或建议都将不胜感激。

P.S。我正在使用VSTS存储库来存储所有应用程序代码,这可能是(我猜是)人们建议在将密码存储在 appsettings.json

中时至少对密码进行哈希处理的原因

1 个答案:

答案 0 :(得分:2)

绝对不要仅将appsettings.json文件用于机密,因为它已致力于源代码控制。仅此而已是一个错误的选择。但是,也无法加密appsettings.json中的任何内容。我想,您可以通过其他方式对您的机密进行加密,而仅在事后手动将密文放入appsettings.json中,但是随后您需要某种工具来解密机密,那时这意味着公开您的加密方法(即您的私钥),这会破坏整个观点。总之,请不要使用appsettings.json

环境变量是一种折衷解决方案。由于您是在服务器上(而不是在源代码管理中)手动设置它们的,并且可以将它们设置为只能由某些用户访问(访问受限),因此您将获得一定的安全性。但是,它们也存储为纯文本格式,这意味着如果有人能够访问服务器来查看它们,则所有安全性都将无法使用。也可以在DevOps(以前称为VSTS)的CI \ D管道中设置环境变量,因此,只要进行部署的服务帐户具有必要的访问权限,就不必直接访问服务器。

Azure Key Vault是推荐的方法,因为它是唯一支持加密的内置配置提供程序,这意味着您的机密在静态和端到端几乎都是安全的。但是,除了可以立即使用之外,Azure Key Vault没什么特别的。可以想象,您可以使用任何可以安全存储机密信息的服务。您可能只需要编写自己的配置提供程序来定位它即可。