Security 微软有没有推荐的方法来处理HttpClient中标题中的秘密?

Security 微软有没有推荐的方法来处理HttpClient中标题中的秘密?,security,asp.net-core,encryption,.net-core,dotnet-httpclient,Security,Asp.net Core,Encryption,.net Core,Dotnet Httpclient,密切相关: 也密切相关: 极为密切相关的OP试图实现非常相似的目标: .NET Framework具有名为的类。然而,即使是微软也不再推荐将其用于新的开发。根据第一个链接的Q&A,至少有一个原因是字符串至少会在内存中以明文形式存在一段时间,即使时间很短。至少有一个答案也扩展了这一论点,即如果他们无论如何都可以访问服务器的内存,那么实际上安全性很可能会被破坏,所以这对你没有帮助。第二个链接的Q&A暗示,甚至有人讨论要完全从.NETCore中删除它 话虽如此,微软关于SecureString的文档并

密切相关:

也密切相关:

极为密切相关的OP试图实现非常相似的目标:

.NET Framework具有名为的类。然而,即使是微软也不再推荐将其用于新的开发。根据第一个链接的Q&A,至少有一个原因是字符串至少会在内存中以明文形式存在一段时间,即使时间很短。至少有一个答案也扩展了这一论点,即如果他们无论如何都可以访问服务器的内存,那么实际上安全性很可能会被破坏,所以这对你没有帮助。第二个链接的Q&A暗示,甚至有人讨论要完全从.NETCore中删除它

话虽如此,微软关于SecureString的文档并不建议更换,而关于链接问答的共识似乎是,这种措施无论如何都没有多大用处

我的应用程序是一个ASP.NET核心应用程序,广泛使用使用HttpClient类对外部供应商的API调用。HttpClient的目标是使用单个实例,而不是为每个调用创建一个新实例

但是,我们的供应商要求所有API调用都包含我们的API密钥,作为具有特定名称的头。我目前安全地存储密钥,在Startup.cs中检索它,并将其添加到我们的HttpClient实例的头中

不幸的是,这意味着在应用程序的整个生命周期中,我的API密钥将以明文形式保存在内存中。我发现这对于服务器上的web应用程序来说尤其麻烦;尽管服务器由公司IT维护,但我一直被教导要将公司网络视为半敌对环境,而不是在这种情况下纯粹依靠公司防火墙来实现应用程序安全

对于这种情况,微软有推荐的最佳实践吗?这是他们反对使用SecureString的建议的潜在例外吗?具体如何工作是另一个问题。或者另一个问答题的答案说我不应该担心像这样存在于内存中的明文字符串,这真的正确吗


注意:根据对这个问题的回答,我可能会发布一个后续问题,关于是否可以使用SecureString之类的东西作为HttpClient头的一部分。或者我需要做一些棘手的事情,比如在使用标题之前填充标题,然后在使用之后将其从内存中删除?不过,这会给并发调用带来一场噩梦。如果人们认为我应该做这样的事情,我会很高兴为此提出一个新问题。

你太偏执了

首先,如果黑客以root用户身份访问您的web服务器,那么您将面临比您的超级机密web应用程序凭据被盗更大的问题。一路,一路,一路,更大的问题。一旦黑客站在你这边的密闭舱口,游戏就结束了

第二,一旦你的信息安全团队检测到入侵,如果他们不这样做,你就会再次遇到更大的问题,他们会告诉你,你要做的第一件事就是更改你知道的每一个密钥和密码

<3>第三,如果黑客确实获得了对你的Web服务器的root访问权限,他们的第一个想法不会是让我们在以后的分析中使用内存转储。转储文件相当大,通过网络传输需要时间,网络流量可能会引起注意,至少在Windows上会将进程挂起,直到它完成,这样你就会注意到你的web应用程序没有响应——这两种情况都可能会引起一些危险信号

不,黑客是为了在最短的时间内获取尽可能多的有价值的信息,因为他们知道他们的访问随时可能被发现。所以他们会选择低挂果实的名字——用户名和密码。然后,他们将继续尝试找出连接到该服务器的是什么,因为您的DB凭据可能位于该服务器上的配置文件中,所以他们几乎肯定会将注意力转移到更有趣的目标上


因此,从各方面考虑,您的API密钥不太可能被泄露——即使是,也不会因为您做了或没有做的事情而泄露。有很多更有效的方法来集中你的时间,而不是试图确保已经或应该是非常安全的事情。而且,在一天结束时,无论你设置了多少层安全措施。。。在某个阶段,API或SSL密钥将在内存中处于原始状态。

这些都是合理的。我想我担心得太多了。这只是事实的一半。问题是,SecureString在windows上是加密的,在unix上不是。一旦释放了包含它的缓冲区,它会很快被释放,而且你可能会使用不安全的代码来将字符串归零,即使没有它。SecureString的实际问题是
建造它并不容易。您只有一个无参数构造函数,用于逐个char或通过char*或另一个SecureString构造char。经典的用例是将配置文件中的字符串直接反序列化到配置文件中,或者从UI中逐字符地反序列化。*.App.Config支持加密字符串/机密,但该功能严重依赖于在本地计算机证书存储上安装特定的证书进行加密/解密,这并不能很好地转换为Linux和docker容器,因此该功能在非Windwos操作系统上不存在。如果你真的担心这个问题,你可以创建一个字符串扩展方法,使用不安全的代码来获取指针,并将包含密码的内存归零,您只需确保不再访问该字符串。将字符串归零并不能真正保证秘密不会在其他地方,例如,如果在某个地方进行了某些浓缩或复制了该字符串,如string newString=new stringoldString。但我觉得麻烦比它的价值还多,最好保护你的服务器不被人发现。在进行转储并将其发送到外部公司进行调试时,您仍然需要小心,因为这些转储可能会出现在dumps@Tseng你能加上这个作为答案吗?这样我就可以投票了?