我有一个用.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,但我怀疑这不会解决您的关注。