Using SecureString

前端 未结 8 816
醉梦人生
醉梦人生 2020-12-24 00:56

Can this be simplified to a one liner? Feel free to completely rewrite it as long as secureString gets initialized properly.

SecureString secureString = new          


        
相关标签:
8条回答
  • 2020-12-24 01:22

    Slight improvement on Sascha's answer replacing the lambda with a method group

    "fizzbuzz".ToCharArray().ToList().ForEach(ss.AppendChar);
    
    0 讨论(0)
  • 2020-12-24 01:23

    Since SecureString utilizes the IDispose interface. You could actually do it like this.

    SecureString secure = new SecureString();
    foreach(var character in data.ToCharArray())
        secure.AppendChar(character);
    

    Essentially the data would be a parameter.

    If you utilize the using to help alleviate resources; you'll want to be careful about the scope. But this may be a beneficial alternative, depending on usage.

    Update:

    You could actually do a full method signature:

    public static SecureString ConvertStringToSecureString(this string data)
    {
         var secure = new SecureString()
         foreach(var character in data.ToCharArray())
             secure.AppendChar(character);
    
         secure.MakeReadOnly();
         return secure;
    
    }
    

    For the decryption you would want to do:

    public static string ConvertSecureStringToString(this SecureString data)
    {
         var pointer = IntPtr.Zero;
         try
         {
              pointer = Marshal.SecureStringToGlobalAllocUnicode(data);
              return Marshal.PtrToStringUni(pointer);
         }
         finally
         {
              Marshal.ZeroFreeGlobalAllocUnicode(pointer);
         }
    }
    

    The following article will give you some additional information as well.

    0 讨论(0)
  • 2020-12-24 01:31

    Apart from using unsafe code and a char*, there isn't a (much) better way.

    The point here is not to copy SecureString contents to/from normal strings. The constant "fizzbuzz" constant is the security leak here.

    0 讨论(0)
  • 2020-12-24 01:33

    You could use Linq:

    "fizzbuzz".ToCharArray().ToList().ForEach(p => secureString.AppendChar(p));
    
    0 讨论(0)
  • 2020-12-24 01:36
    var s = "fizzbuzz".Aggregate(new SecureString(), (ss, c) => { ss.AppendChar(c); return ss; });
    
    0 讨论(0)
  • 2020-12-24 01:38

    Here is a how NetworkCredential class from .NET doing it:

    SecureString secureString;
    fixed (char* chPtr = plainString)
      secureString = new SecureString(chPtr, plainString.Length);
    

    Ugly but probably the most efficient.

    0 讨论(0)
提交回复
热议问题