JSON.NET和.NET CORE WEBAPI-防止字符串值在过程内存中持续存在



我有一个用.NET Core 2.0编写的API用于分配JSON Web令牌(JWTS(。这是通过具有非常简单模型的帖子请求完成的。

public class TokenRequest
{
    public string Username { get; set; }
    public string Password { get; set; }
}

API的详细信息并不重要 - 此处的目标是在请求完成后防止密码保留在内存中。假设我可以在字符串进入后安全处理 - 我要解决的问题是防止json.net将值分配给字符串,从而导致其被实施。

编辑:正如答案中指出的那样,该字符串在这里没有实施,这是我的错误。即使是这样,我担心的是,密码可能会以我无法控制的(字符串(而不是我可以控制的方式悬挂长时间的记忆(字节数组,我完成后可以将其归零用它(。我删除了为了清楚起见的进一步提及。

要测试,我一直在提出请求并使用windbg来确定值是否在存储器中为字符串。

我的原始模型无法正常工作,因为它使用了string-即使我的代码中没有任何内容Password中的任何内容,它是必不可少的,最终将字符串放在过程内存中,直到收集到垃圾为止。

知道这一点,我尝试了此模型:

public class TokenRequest
{
    public string Username { get; set; }
    public byte[] Password { get; set; }
}

这实际上有效 - 但问题是Password现在必须是Base64编码字符串。我找不到原始的base64值或在存储器中作为字符串中的解码值,这很好,但是对密码base64编码是不希望的。

我已经查看了JsonTextReader的源代码,这很有意义 - ReadAsBytes使用char数组和字节数组读取,从不串起。但是不幸的是,基本64的需求是对。

编辑:在进一步考虑时,密码可能仍存在于内存中,因为字节数组尚未被GCED - 字节数组我无法控制,因为它们在JSON.NET内部

所以,我尝试了一个自定义的jsonconverter:

public class TokenRequest
{
    public string Username { get; set; }
    [JsonConverter(typeof(ByteConverter))]
    public byte[] Password { get; set; }
}

这与原始问题相同的问题 - json.net最终在为转换器解析时通过字符串发送值,因此,即使当我的转换器的ReadJson方法不过是return new byte[] { };时,该值仍然可以在记忆中找到。

摘要

我想将明文字符串值纳入.NET Core WebAPI,一旦请求完成,就不需要等待垃圾收集。

什么样的作品,但不需要

  • 使用 byte[](在警告中必须是基本64(

什么不起作用

  • 使用任何类型的 JsonConverter(json.net内部使用字符串(
  • 以任何身份使用ngen(可能有效,但不是一个选择(

在运行时创建的字符串不会实施,除非某些东西专门要求它们被实习。我认为这也许只是对实习意味着什么的困惑。我认为您更有可能只看到尚未收集垃圾的记忆(或尚未重新分配(。

您可能想查看此问题:在C#Dotnet Core Console App

中确保密码输入

如某些问题中提到的答案:您似乎正在为物理安全问题辩护,而不是代码/数据安全问题。我没有与json.net一起使用Securestring,但我怀疑这不会解决您的关注。

相关内容

  • 没有找到相关文章

最新更新