如何保护用于加密我的网络应用程序appsettings.json
中的敏感数据的加密密钥?
我想在我的网络应用程序的配置中保护敏感数据。
在ASP.NET MVC4应用程序中,我们这样做:
web.config
(或web.prod.config
等),而是写入占位符变量。web.config
中的变量。aspnet_regiis.exe
加密web.config的敏感部分。现在我们正在使用ASP.NET Core,我们正在遵循的流程有点不同。
appsettings.json
包含敏感数据的占位符变量,
类似于web.config之前的工作方式。我认为我需要:
而不是aspnet_regiis
a)制作我自己的自定义工具来加密appsettings.json
文件的各个部分。
b)制作一个可以解密(全部/部分)appsettings.json
我不明白的是如何保护用于(a)和(b)的加密密钥。旧方法利用服务器的机器密钥来加密文件。
我试图缓解的威胁是有人获取访问服务器上的appsettings.json
并从中读取敏感数据(例如数据库密码等)。
我也对使用此方法缓解此威胁和/或其他问题的替代方法感兴趣。
答案 0 :(得分:2)
如果你不相信"信任"服务器 - 你无法保护"秘密"你存储在这个服务器里面。
说明:
无论什么"安全"您发明的(=无担保)计划 - 当应用程序启动时必须能够执行"解密"秘密进入一些可用的"形式。
这意味着所有"键" (证书等)要求"解密"必须存在于此服务器上并且可供应用访问(否则应用无法启动)。
这意味着访问服务器和应用程序的一些坏人也可以访问所有"密钥"在它上面,"解密"你的秘密。可能是通过复制文件,可能是通过反编译你的app,可能会倾销你的app内存 - 但它可以。
没有绝对的保护。
答案 1 :(得分:2)
您似乎对"方式"不感兴趣。要做到这一点,但在ASP.NET Core支持的推荐方法。虽然这里的其他答案提到Azure KeyVault是敏感信息的良好存储,但它不是存储它而是存储实际存储的方式。
ASP.NET Core支持overridable configuration
的概念。也就是说,可以在配置系统中注册多个配置提供程序,并且注册它们的顺序很重要。每个注册的设备都会覆盖以前提供商的设置 - 当然还有这些设置。
换句话说,如果您已注册标准JSON配置提供程序,然后还假设数据库配置提供程序,那么这两个提供程序都具有的设置将获取由后面定义的提供程序定义的值 - 数据库供应商。
所以在你的情况下,我建议这样做:
虽然这不是1:1映射到当前进程的内容,但它符合ASP.NET核心原则。
您可以在以下位置阅读有关ASP.NET配置的更多信息:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/index?tabs=basicconfiguration
在这里,您可以阅读有关Azure KeyVault配置提供程序的信息:https://docs.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?tabs=aspnetcore2x
如果基于证书的身份验证不适合您,请考虑在环境变量中存储用于连接Azure Key Vault服务的ClientId
和ClientSecret
,并使用适当的配置提供程序({{1} } extension方法会这样做来访问那些。
此设置非常安全。祝你好运!
答案 2 :(得分:1)
我正在将评论转换为答案:)
即使您没有在Azure上运行,我仍然建议使用Azure Key Vault来存储您的机密信息。对于初学者来说,它非常便宜(约$ 0.0159 / 10 000次操作),其次可以从任何地方访问,甚至可以在Azure之外访问。此外,Azure Key Vault中的秘密可以进行版本化,这是一个很好的功能,可以支持每个环境的多个版本的秘密(仅用于预生产,因为Production应该有自己的密钥库)。 Key Vault NuGet包具有在.NET Core中检索和添加机密的操作。 Here是文档的链接。
您可以拥有内存缓存,因此只能在应用程序启动时(或缓存过期时)向密钥保管库发出REST调用(或Key Vault包方法调用),从而防止任何进一步的延迟。第三,这是微软推荐的方法。
希望这有帮助。
答案 3 :(得分:1)
如果有人未经授权访问服务器,那么窃取秘密 - 比如数据库连接字符串,只是问题的一小部分(@Dmitry的答案)。
由于您希望更好地控制秘密数据或配置,因此 okay 稍微偏离通常基于 appsettings.json
的方法。
您可以获取机密,使用服务器证书对它们进行非对称加密,将它们存储在单独的文件中(可能是另一个.json
文件)然后读取文件并解密密码在启动时/在每个Web请求上。这样,秘密几乎和服务器的证书/私钥一样安全。
另一种选择:对称加密秘密并在启动时将密码提供给Web应用程序,以便它可以解密秘密。当托管Web应用程序的进程重新启动时,您必须再次提供密码(您可以使用单独的计算机定期提供它)。
另见Data Protection in ASP.NET Core,Data Protection samples。
有时,长而隐秘的密码或简单模糊其他人性化密码就足够了。也就是说,只是防止窃听。比如,坐在管理员旁边的人无法阅读并记住一串明显随机的字符。