Zeichenketten Verschlüsselt im Arbeitsspeicher

Wer sieht schon gerne seine Daten als Klartext im Speicher, so dass diese von jedem Programm genutzt werden können? Seit .NET 2.0 gibt es für Zeichenketten eine Abhilfe, denn die Klasse „SecureString“ sorgt genau dafür, dass die Daten mithilfe der DPAPI (Data Protection API) verschlüsselt im Speicher laden. Diese API sorgt dafür, dass die Daten erst beim erneuten Zugriff durch das ablegende Programm entschlüsselt werden. Um dies zu erzielen, kann eine einfache Methode implementiert werden, welche aus einem String ein SecureString Object erzeugt.

Zunächst einmal benötigen wir zwei Using-Directives, um die nötigen Methoden zur Verfügung gestellt zu bekommen. Diese wären Folgende:

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

Anschließend können wir nun die Methode implementieren. Bevor wir dies jedoch tun, sollten wir in unserem Projekt die Verwendung von unsicherem Code zulassen, dies geschieht über die Projekteigenschaften. Wenn dies erledigt ist, können wir nun das Schlüsselwort „unsafe“ verwenden, welches wir aufgrund von Pointer Nutzung benötigen. Kommen wir aber nun zur Methode.

unsafe void CreateSecureString(ref string data)
{
    SecureString secureString = null; 
    char[] secureContent = data.ToCharArray();
    data = null; 

    fixed(char* buffer = secureContent)
    {
        secureString = new SecureString(buffer, secureContent.Length);
    } 

    secureString.MakeReadOnly();
    IntPtr secStrPtr = Marshal.SecureStringToBSTR(secureString); 

    try
    {
        Console.WriteLine(Marshal.PtrToStringBSTR(secStrPtr));
    }
    finally
    {
        Marshal.ZeroFreeBSTR(secStrPtr);
    }

    secureString.Dispose();
}

Da kann man doch gleich ruhiger schlafen, wenn die Daten verschlüsselt im Speicher landen, nicht wahr? Natürlich kann man hier nun den Integer-Pointer auch nach oben reichen, um dies wieder an anderen Stellen verwenden zu können. Aber wie auch bei C++ darf der Pointer nicht einfach verloren gehen, denn sonst ist der Speicherbereich bis zum PC-Neustart geblockt.