Skip to main content

Data Protection API

In der vorherigen Folge haben Sie verschiedene Kryptographie-Verfahren kennen gelernt. Sowohl symmetrische als auch asymmetrische Konzelationssysteme können Sie verwenden, um in Desktop-Anwendungen Daten vor unbefugter Kenntnisnahme zu schützen. Microsoft stellt aber auch eine komfortablere Lösung zur Verfügung: das Data Protection API (DPAPI).

DPAPI stellt verschiedene Funktionen zur Ver- und Entschlüsselung von Daten bereit. Besonders interessant ist DPAPI, weil es die Schlüsselverwaltung übernimmt. Die öffentlichen DPAPI-Interfaces sind Bestandteil der Crypt32.dll, das selbst wiederum Bestandteil des CryptoAPI ist, und für alle Benutzerprozesse, die die Bibliothek geladen haben, verfügbar.

Die Schlüsselerzeugung und -verwaltung

DPAPI erzeugt aus den Zugangsdaten (i.d.R. dem Passwort) des jeweiligen Benutzers einen Schlüssel, mit dem ein danach erzeugter Master Key verschlüsselt wird. Bei jedem Aufruf einer Verschlüsselungsfunktion wird aus dem Master Key, Zufallsdaten und optional einem vom Benutzer gelieferten Entropie-Wert ein Sitzungsschlüssel berechnet und für die symmetrische Verschlüsselung der Daten verwendet.

Die für die Schlüsselerzeugung verwendeten Zufallsdaten werden zusammen mit den verschlüsselten Daten gespeichert, um daraus bei der späteren Entschlüsselung den temporären Schlüssel erneut berechnen zu können. Wurde ein Entropie-Wert verwendet, muss dieser vom Programm separat gespeichert werden.

Der Entropie-Wert sorgt bei Bedarf dafür, dass keine anderen Programme auf die verschlüsselten Daten eines Programms zugreifen können. Prinzipiell können alle vom aktuellen Benutzer gestarteten Programme alle mit DPAPI geschützten Daten entschlüsseln, da alle Sitzungsschlüssel aus dessen Zugangsdaten abgeleitet werden.

Master-Key mit Verfallsdatum

Der Master Key verfällt aus Sicherheitsgründen nach einigen Monaten und wird durch einen neuen ersetzt, der danach für die Verschlüsselung verwendet wird. Der alte Master Key wird aufbewahrt, um damit verschlüsselte Daten weiter entschlüsseln zu können. Bei einer Änderung der Zugangsdaten wird der Master Key entsprechend angepasst, sodass weiter auf die durch DPAPI geschützten Daten zugegriffen werden kann. Bei einer Neuinstallation des Systems geht der Schlüssel jedoch verloren, sodass die Daten danach nicht mehr entschlüsselt werden können.

Ist ein Computer Bestandteil einer Domain, wird auf dem Domain Controller ein verschlüsseltes Backup des Master Key gespeichert, für Standalone-Rechner kann eine Password Reset Disk (PRD) erzeugt werden, mit der bei Bedarf das Passwort zurückgesetzt und die Master-Keys mit dem neuen Passwort verschlüsselt werden können. Unter Windows 7 können Sie ggf. auch den DPAPI Key Migration Wizard (dpapimig.exe) nutzen, um die Schlüssel wiederherzustellen.

Die DPAPI-Funktionen

DPAPI stellt vier Funktionen bereit:

  1. CryptProtectData() verschlüsselt die übergebenen Daten, die dann gespeichert werden können.
  2. CryptUnprotectData() entschlüsselt diese Daten.
  3. CryptProtectMemory() dient der Verschlüsselung von Daten, die nur im Speicher gehalten werden sollen und nicht gespeichert werden müssen.
  4. CryptUnprotectMemory() entschlüsselt diese Daten.

Der Unterschied zwischen ProtectedData und ProtectedMemory besteht darin, das bei einem Reboot zwischen Protect- und Unprotect-Aufruf bei ProtectedMemory keine Entschlüsselung mehr möglich ist. ProtectedMemory ist z.B. gut dafür geeignet, während der Laufzeit des Programms im Speicher abgelegte Zugangsdaten zu schützen, während ProtectedData z.B. zum Schutz vertraulicher Informationen in Konfigurationsdateien verwendet werden kann.

DPAPI im Einsatz

In .NET erfolgt der Zugriff auf die Funktionen CryptProtectData() und CryptUnprotectData() über die Klasse ProtectedData mit den Methoden Protect und Unprotect, die z.B. in C# folgende Syntax haben:

byte[] Protect(byte[] userData, byte[] optionalEntropy, DataProtectionScope scope)
byte[] Unprotect(byte[] encryptedData, byte[] optionalEntropy, DataProtectionScope scope)


optionalEntropy ist der optionale Entropie-Wert, durch dessen Einsatz bei Bedarf verhindert wird, dass andere Programme auf die verschlüsselten Daten zugreifen können. DataProtectionScope kann zwei Werte annehmen:

  1. DataProtectionScope.CurrentUser verschlüsselt die Daten so, dass nur der aktuelle Benutzer die Daten entschlüsseln kann.
  2. DataProtectionScope.LocalMachine verschlüsselt die Daten so, dass jeder auf dem lokalen Rechner laufende Prozess die Daten entschlüsseln kann, unabhängig davon, welcher Benutzer diesen Prozess gestartet hat.

Auf die Funktionen CryptProtectMemory() und CryptUnprotectMemory() kann in .NET über die Klasse ProtectedMemory zugegriffen werden, die ebenfalls die Methoden Protect und Unprotect zur Verfügung stellt. Beide Methoden ver- bzw. entschlüsseln direkt den übergebenen Speicher. Ihre Syntax in C#:

void Protect(byte[] userData, MemoryProtectionScope scope)
void Unprotect(byte[] encryptedData, MemoryProtectionScope scope)

 

MemoryProtectionScope kann drei Werte annehmen:

  1. MemoryProtectionScope.SameProcess verschlüsselt die Daten so, dass nur Code aus dem aktuellen Prozess die Daten entschlüsseln kann.
  2. MemoryProtectionScope.CrossProcess verschlüsselt die Daten so, dass Code aus allen Prozessen die Daten entschlüsseln kann.
  3. MemoryProtectionScope.SameLogon verschlüsselt die Daten so, dass nur Code in Prozessen, die unter dem gleichen Benutzer laufen, die Daten entschlüsseln kann.

Ein Beispiel für die Anwendung von ProtectedData:

using System;
using System.Text;
using System.Security.Cryptography;
public class DPAPIBeispiel

{
  public static void Main()
  {
    try
    {
     // Erzeugen eines UnicodeEncoder zur Umwandlung 
     // zwischen Byte-Array und String

     UnicodeEncoding ByteConverter = new UnicodeEncoding();

      // Byte-Array für zusätzliche Entropie

      byte[] entropie = { 1, 2, 3, 4, 5 };

      // Byte-Array mit dem Klartext

      byte[] klartext = ByteConverter.GetBytes("Einfach nur ein Testtext...");

      // Verschlüsseln der Daten mit DataProtectionScope.CurrentUser:
      // Ergebnis kann nur vom gleichen Benutzer entschlüsselt werden

      byte[] schluesseltext = ProtectedData.Protect(klartext, entropie, DataProtectionScope.CurrentUser);

      // Entschlüsseln der Daten mit DataProtectionScope.CurrentUser:

       byte[] entschluesselt = ProtectedData.Unprotect(schluesseltext, entropie, DataProtectionScope.CurrentUser);

      // Und jetzt alles ausgeben...

      Console.WriteLine("Der Klartext:");
      Console.WriteLine(ByteConverter.GetString(klartext));
      Console.WriteLine();
      Console.WriteLine("Der Schlüsseltext (Hexadezimal):");

       string hexschluesseltext = BitConverter.ToString(schluesseltext);

      Console.WriteLine(hexschluesseltext.Replace("-", " "));
      Console.WriteLine();
      Console.WriteLine("... entschlüsselt:");
      Console.WriteLine(ByteConverter.GetString(entschluesselt));
      Console.WriteLine();
      Console.WriteLine("Weiter mit RETURN");

        string nix = Console.ReadLine();
      }
       catch (Exception e)
       {
         Console.WriteLine("Fehler: {0}", e.Message);
       }
    }
 

 

Der Quelltext ist selbsterklärend. Vor dem Kompilieren muss ein Verweis auf die System.Security.dll eingeschlossen werden.

DRAPI

Die mit ProtectedData verschlüsselten Daten können dann z.B. in Konfigurationsdateien gespeichert werden. Eine Übertragung auf andere Rechner ist nicht möglich, da die Daten dort nicht entschlüsselt werden können. Für diesen Zweck ist DPAPI nicht geeignet, stattdessen müssen Sie die entsprechenden allgemeinen Kryptographie-Funktionen zur symmetrischen oder asymmetrischen Verschlüsselung verwenden.

Die Anwendung von ProtectedMemory verläuft analog.

Welche Methoden für welchen Zweck geeignet sind, zeigt die folgende Tabelle:

VerwendungszweckProtectedDataProtectedMemorySystem.Security.Cryptography-Methoden
Speicherung in Dateija ja
Speicherung in Datenbankja ja
Verwendung in einem Programm jaja
Verwendung bei mehreren Programmen, keine Speicherung jaja
Übertragung auf andere Rechner  ja
 

Autor des Artikels

Dipl.-Inform. Carsten Eilers ( www.ceilers-it.de) ist als freier Berater und Coach für IT-Sicherheit und technischen Datenschutz tätig und als Autor verschiedener Artikel und des Buches "Ajax Security" bekannt.  Seinen Blog finden Sie hier.

 



These postings are provided "AS IS" with no warranties, and confers no rights. Use of included code samples are subject to the terms specified at Microsoft - Information on Terms of Use. The content of these security articles are the own personal opinions from Carsten Eilers.

Microsoft führt eine Onlineumfrage durch, um Ihre Meinung zur -Website zu erfahren. Wenn Sie sich zur Teilnahme entscheiden, wird Ihnen die Onlineumfrage angezeigt, sobald Sie die -Website verlassen.

Möchten Sie teilnehmen?