带有SecureString的JSON ToObject

Del*_*rog 4 .net c# serialization json json.net

我无法将JSON文本序列化为包含SecureString变量的对象.我如何在保持公共'pwd'变量为SecureString的同时序列化以下内容?

假设有以下字符串:

string j_str = "{ 'uid':'JohnDoe', 'age':30, 'pwd':'MyPassword' }";
Run Code Online (Sandbox Code Playgroud)

我想将此字符串序列化为我在C#中的对象

public class User
{
   public string uid = { get; set; }
   public string age = { get; set; }
   public SecureString pwd = { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所以我可以使用Newtonoft调用以下调用JSON ToObject),如下所示:

JObject j_obj = JObject.Parse(j_str);

User newUser = j_obj.ToObject<User>();
Run Code Online (Sandbox Code Playgroud)

这会导致以下错误:

Newtonsoft.Json.JsonSerializationException: 'Error converting value "MyPassword" to type 'System.Security.SecureString'. Path 'pwd'
Run Code Online (Sandbox Code Playgroud)

小智 6

从字符串构造它似乎违背了使用SecureString背后的原则.请参阅https://msdn.microsoft.com/en-us/library/system.security.securestring(v=vs.110).aspx:

永远不应该从String构造SecureString对象,因为敏感数据已经受到不可变String类的内存持久性影响.构造SecureString对象的最佳方法是来自一次一个字符的非托管源,例如Console.ReadKey方法.

  • 看起来,如果字符串是明文密码。但是,如果您对加密字符串进行序列化/反序列化,则不会将明文秘密泄漏到内存中。此外,在许多情况下,您无法在 SecureString 中始终保持秘密,因此您可以临时将其提取到字符串或从字符串中构造,然后您可以将字符串固定在不安全的代码块中以将其归零。大量的示例和代码示例,包括 stackoverflow 上的许多示例。 (2认同)