SecureString effektiv nutzen und verwenden

Mit Hilfe der Klasse SecureString ermöglicht das .NET-Framework auch String Daten nicht vollig entblößt im Arbeitsspeicher abzulegen, um z.B. den Zugriff von anderen Applikationen zu vermeiden. Leider ist mit SecureString nicht allzu einfach umzugehen und es kommt vor, dass man diesen für Momentaufnahmen dennoch als normalen String im Speicher benötigt, um damit z.B. den Inhalt in einer Oberfläche anzuzeigen oder um die Daten speichern zu können. Hier kann mit der Hilfe von Datentyp-Extensions gut Abhilfe geschaffen werden. So können wir uns Methoden implementieren, die es uns ermöglichen auch den SecureString wieder im Quellcode effektiv zu nutzen und dennoch parallel die Sicherheit zu verbessern (auch wenn zur absoluten Sicherheit die Rückwandlung nicht möglich sein sollte).

Aber wie kommen wir wieder an unsere Werte? Na ganz simpel mit den folgenden SecureString-Extensions:

using System;
using System.Runtime.InteropServices;
using System.Security;

public static class SecureStringExtensions
{
    public static string GetValue(this SecureString secureValue)
    {
        IntPtr valuePtr = IntPtr.Zero;

        try
        {
            valuePtr = Marshal.SecureStringToGlobalAllocUnicode(secureValue);
            return Marshal.PtrToStringUni(valuePtr);
        }
        finally
        {
            Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
        }
    }

    public static void SetValue(this SecureString secureValue, string value)
    {
        secureValue.Clear();
        secureValue.AppendString(value);
    }

    public static string ToUnsecure(this SecureString secureValue)
    {
        return secureValue.GetValue();
    }

    public static void AppendString(this SecureString secureValue, string value)
    {
        foreach (char c in value)
            secureValue.AppendChar(c);
    }
}

Zusätzlich würde ich folgende Extension beim Datentyp String empfehlen:

using System;
using System.Globalization;
using System.Security;
using System.Text;

public static class StringExtensions
{
    public static SecureString ToSecure(this string value)
    {
        SecureString secureString = new SecureString();
        secureString.SetValue(value);

        return secureString;
    }
}