MSDN Library

Gewusst wie: Verwenden von Datenschutz

Aktualisiert: November 2007

.NET Framework bietet Zugriff auf die Data Protection API (DPAPI), die das Verschlüsseln von Daten mithilfe von Informationen vom aktuellen Benutzerkonto oder Computer ermöglicht. Bei Verwendung der DPAPI umgehen Sie die schwierige Aufgabe, einen kryptografischen Schlüssel explizit zu generieren und zu speichern.

Mit der ProtectedMemory-Klasse können Sie ein speicherinternes Bytearray verschlüsseln. Diese Funktionalität ist ab Microsoft Windows XP verfügbar. Sie können festlegen, dass der durch den aktuellen Prozess verschlüsselte Speicher nur durch den aktuellen Prozess, durch alle Prozesse oder von demselben Benutzerkontext entschlüsselt werden kann. Eine ausführliche Beschreibung von ProtectedMemory-Optionen finden Sie in der MemoryProtectionScope-Enumeration.

Verwenden Sie die ProtectedData-Klasse, um eine Kopie eines Bytearrays zu verschlüsseln. Diese Funktionalität ist ab Microsoft Windows 2000 verfügbar. Sie können festlegen, dass vom aktuellen Benutzerkonto verschlüsselte Daten nur von demselben Benutzerkonto entschlüsselt werden können, oder Sie können angeben, dass die vom aktuellen Benutzerkonto verschlüsselten Daten von jedem Konto auf dem Computer entschlüsselt werden können. Eine ausführliche Beschreibung von ProtectedData-Optionen finden Sie in der DataProtectionScope-Enumeration.

So verschlüsseln Sie unter Verwendung von Datenschutz speicherinterne Daten

  • Rufen Sie die statische Protect-Methode auf, wenn Sie ein zu verschlüsselndes Bytearray, die Entropie und den Speicherschutzbereich übergeben.

So entschlüsseln Sie unter Verwendung von Datenschutz speicherinterne Daten

  • Rufen Sie die statische Unprotect-Methode auf, wenn Sie ein zu entschlüsselndes Bytearray und den Speicherschutzbereich übergeben.

So schreiben Sie unter Verwendung von Datenschutz verschlüsselte Daten in eine Datei oder einen Stream

  1. Erstellen Sie eine zufällige Entropie.

  2. Rufen Sie die statische Protect-Methode auf, wenn Sie ein zu verschlüsselndes Bytearray, die Entropie und den Datenschutzbereich übergeben.

  3. Schreiben Sie die verschlüsselten Daten in eine Datei oder einen Stream.

So verschlüsseln Sie unter Verwendung von Datenschutz Daten aus einer Datei oder einem Stream

  1. Lesen Sie die verschlüsselten Daten aus einer Datei oder aus einem Stream.

  2. Rufen Sie die statische Unprotect-Methode auf, wenn Sie ein zu entschlüsselndes Bytearray und den Datenschutzbereich übergeben.

Im folgenden Codebeispiel werden zwei Arten von Verschlüsselung und Entschlüsselung veranschaulicht. Im Codebeispiel wird zunächst ein speicherinternes Bytearray verschlüsselt und anschließend entschlüsselt. Dann wird eine Kopie eines Bytearrays verschlüsselt, in einer Datei gespeichert, die Daten aus der Datei werden erneut geladen, und anschließend werden die Daten entschlüsselt. Im Beispiel werden die ursprünglichen Daten, die verschlüsselten Daten und die entschlüsselten Daten angezeigt.

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;

public class MemoryProtectionSample
{
    public static void Main()
    {
        Run();
    }

    public static void Run()
    {
        try
        {

            ///////////////////////////////
            //
            // Memory Encryption - ProtectedMemory
            //
            ///////////////////////////////

            // Create the original data to be encrypted (The data length should be a multiple of 16).
            byte[] toEncrypt = UnicodeEncoding.ASCII.GetBytes("ThisIsSomeData16");

            Console.WriteLine("Original data: " + UnicodeEncoding.ASCII.GetString(toEncrypt));
            Console.WriteLine("Encrypting...");

            // Encrypt the data in memory.
            EncryptInMemoryData(toEncrypt, MemoryProtectionScope.SameLogon);

            Console.WriteLine("Encrypted data: " + UnicodeEncoding.ASCII.GetString(toEncrypt));
            Console.WriteLine("Decrypting...");

            // Decrypt the data in memory.
            DecryptInMemoryData(toEncrypt, MemoryProtectionScope.SameLogon);

            Console.WriteLine("Decrypted data: " + UnicodeEncoding.ASCII.GetString(toEncrypt));


            ///////////////////////////////
            //
            // Data Encryption - ProtectedData
            //
            ///////////////////////////////

            // Create the original data to be encrypted
            toEncrypt = UnicodeEncoding.ASCII.GetBytes("This is some data of any length.");

            // Create a file.
            FileStream fStream = new FileStream("Data.dat", FileMode.OpenOrCreate);

            // Create some random entropy.
            byte[] entropy = CreateRandomEntropy();

            Console.WriteLine();
            Console.WriteLine("Original data: " + UnicodeEncoding.ASCII.GetString(toEncrypt));
            Console.WriteLine("Encrypting and writing to disk...");

            // Encrypt a copy of the data to the stream.
            int bytesWritten = EncryptDataToStream(toEncrypt, entropy, DataProtectionScope.CurrentUser, fStream);

            fStream.Close();

            Console.WriteLine("Reading data from disk and decrypting...");

            // Open the file.
            fStream = new FileStream("Data.dat", FileMode.Open);

            // Read from the stream and decrypt the data.
            byte[] decryptData = DecryptDataFromStream(entropy, DataProtectionScope.CurrentUser, fStream, bytesWritten);

            fStream.Close();

            Console.WriteLine("Decrypted data: " + UnicodeEncoding.ASCII.GetString(decryptData));


        }
        catch (Exception e)
        {
            Console.WriteLine("ERROR: " + e.Message);
        }

    }


    public static void EncryptInMemoryData(byte[] Buffer, MemoryProtectionScope Scope )
    {
        if (Buffer.Length <= 0)
            throw new ArgumentException("Buffer");
        if (Buffer == null)
            throw new ArgumentNullException("Buffer");


        // Encrypt the data in memory. The result is stored in the same same array as the original data.
        ProtectedMemory.Protect(Buffer, Scope);

    }

    public static void DecryptInMemoryData(byte[] Buffer, MemoryProtectionScope Scope)
    {
        if (Buffer.Length <= 0)
            throw new ArgumentException("Buffer");
        if (Buffer == null)
            throw new ArgumentNullException("Buffer");


        // Decrypt the data in memory. The result is stored in the same same array as the original data.
        ProtectedMemory.Unprotect(Buffer, Scope);

    }

    public static byte[] CreateRandomEntropy()
    {
        // Create a byte array to hold the random value.
        byte[] entropy = new byte[16];

        // Create a new instance of the RNGCryptoServiceProvider.
        // Fill the array with a random value.
        new RNGCryptoServiceProvider().GetBytes(entropy);

        // Return the array.
        return entropy;


    }

    public static int EncryptDataToStream(byte[] Buffer, byte[] Entropy, DataProtectionScope Scope, Stream S)
    {
        if (Buffer.Length <= 0)
            throw new ArgumentException("Buffer");
        if (Buffer == null)
            throw new ArgumentNullException("Buffer");
        if (Entropy.Length <= 0)
            throw new ArgumentException("Entropy");
        if (Entropy == null)
            throw new ArgumentNullException("Entropy");
        if (S == null)
            throw new ArgumentNullException("S");

        int length = 0;

        // Encrypt the data in memory. The result is stored in the same same array as the original data.
        byte[] encrptedData = ProtectedData.Protect(Buffer, Entropy, Scope);

        // Write the encrypted data to a stream.
        if (S.CanWrite && encrptedData != null)
        {
            S.Write(encrptedData, 0, encrptedData.Length);

            length = encrptedData.Length;
        }

        // Return the length that was written to the stream. 
        return length;

    }

    public static byte[] DecryptDataFromStream(byte[] Entropy, DataProtectionScope Scope, Stream S, int Length)
    {
        if (S == null)
            throw new ArgumentNullException("S");
        if (Length <= 0 )
            throw new ArgumentException("Length");
        if (Entropy == null)
            throw new ArgumentNullException("Entropy");
        if (Entropy.Length <= 0)
            throw new ArgumentException("Entropy");



        byte[] inBuffer = new byte[Length];
        byte[] outBuffer;

        // Read the encrypted data from a stream.
        if (S.CanRead)
        {
            S.Read(inBuffer, 0, Length);

            outBuffer = ProtectedData.Unprotect(inBuffer, Entropy, Scope);
        }
        else
        {
            throw new IOException("Could not read the stream.");
        }

        // Return the length that was written to the stream. 
        return outBuffer;

    }


}


Community-Beiträge

Anzeigen:
© 2016 Microsoft