ProtectedData Класс

Определение

Предоставляет методы для шифрования и расшифровки данных.Provides methods for encrypting and decrypting data. Этот класс не наследуется.This class cannot be inherited.

public ref class ProtectedData abstract sealed
public ref class ProtectedData sealed
public static class ProtectedData
public sealed class ProtectedData
type ProtectedData = class
Public Class ProtectedData
Public NotInheritable Class ProtectedData
Наследование
ProtectedData

Примеры

В следующем примере показано, как использовать защиту данных.The following example shows how to use data protection.

#using <System.Security.dll>

using namespace System;
using namespace System::Security::Cryptography;

public ref class DataProtectionSample
{
private:

   // Create byte array for additional entropy when using Protect method.
   static array<Byte>^s_additionalEntropy = {9,8,7,6,5};

public:
   static void Main()
   {
      
      // Create a simple byte array containing data to be encrypted.
      array<Byte>^secret = {0,1,2,3,4,1,2,3,4};
      
      //Encrypt the data.
      array<Byte>^encryptedSecret = Protect( secret );
      Console::WriteLine( "The encrypted byte array is:" );
      PrintValues( encryptedSecret );
      
      // Decrypt the data and store in a byte array.
      array<Byte>^originalData = Unprotect( encryptedSecret );
      Console::WriteLine( "{0}The original data is:", Environment::NewLine );
      PrintValues( originalData );
   }

   static array<Byte>^ Protect( array<Byte>^data )
   {
      try
      {
         
         // Encrypt the data using DataProtectionScope.CurrentUser. The result can be decrypted
         //  only by the same current user.
         return ProtectedData::Protect( data, s_additionalEntropy, DataProtectionScope::CurrentUser );
      }
      catch ( CryptographicException^ e ) 
      {
         Console::WriteLine( "Data was not encrypted. An error occurred." );
         Console::WriteLine( e );
         return nullptr;
      }
   }

   static array<Byte>^ Unprotect( array<Byte>^data )
   {
      try
      {
         
         //Decrypt the data using DataProtectionScope.CurrentUser.
         return ProtectedData::Unprotect( data, s_additionalEntropy, DataProtectionScope::CurrentUser );
      }
      catch ( CryptographicException^ e ) 
      {
         Console::WriteLine( "Data was not decrypted. An error occurred." );
         Console::WriteLine( e );
         return nullptr;
      }
   }

   static void PrintValues( array<Byte>^myArr )
   {
      System::Collections::IEnumerator^ myEnum = myArr->GetEnumerator();
      while ( myEnum->MoveNext() )
      {
         Byte i = safe_cast<Byte>(myEnum->Current);
         Console::Write( "\t{0}", i );
      }

      Console::WriteLine();
   }
};

int main()
{
   DataProtectionSample::Main();
}
using System;
using System.Security.Cryptography;

public class DataProtectionSample
{
    // Create byte array for additional entropy when using Protect method.
    static byte [] s_additionalEntropy = { 9, 8, 7, 6, 5 };

    public static void Main()
    {
        // Create a simple byte array containing data to be encrypted.
        byte [] secret = { 0, 1, 2, 3, 4, 1, 2, 3, 4 };

        //Encrypt the data.
        byte [] encryptedSecret = Protect( secret );
        Console.WriteLine("The encrypted byte array is:");
        PrintValues(encryptedSecret);

        // Decrypt the data and store in a byte array.
        byte [] originalData = Unprotect( encryptedSecret );
        Console.WriteLine("{0}The original data is:", Environment.NewLine);
        PrintValues(originalData);
    }

    public static byte [] Protect( byte [] data )
    {
        try
        {
            // Encrypt the data using DataProtectionScope.CurrentUser. The result can be decrypted
            // only by the same current user.
            return ProtectedData.Protect( data, s_additionalEntropy, DataProtectionScope.CurrentUser );
        }
        catch (CryptographicException e)
        {
            Console.WriteLine("Data was not encrypted. An error occurred.");
            Console.WriteLine(e.ToString());
            return null;
        }
    }

    public static byte [] Unprotect( byte [] data )
    {
        try
        {
            //Decrypt the data using DataProtectionScope.CurrentUser.
            return ProtectedData.Unprotect( data, s_additionalEntropy, DataProtectionScope.CurrentUser );
        }
        catch (CryptographicException e)
        {
            Console.WriteLine("Data was not decrypted. An error occurred.");
            Console.WriteLine(e.ToString());
            return null;
        }
    }

    public static void PrintValues( Byte[] myArr )
    {
        foreach ( Byte i in myArr )
        {
            Console.Write( "\t{0}", i );
        }
        Console.WriteLine();
    }
}
Imports System.Security.Cryptography



Public Class DataProtectionSample
    ' Create byte array for additional entropy when using Protect method.
    Private Shared s_additionalEntropy As Byte() = {9, 8, 7, 6, 5}


    Public Shared Sub Main()
        ' Create a simple byte array containing data to be encrypted.
        Dim secret As Byte() = {0, 1, 2, 3, 4, 1, 2, 3, 4}

        'Encrypt the data.
        Dim encryptedSecret As Byte() = Protect(secret)
        Console.WriteLine("The encrypted byte array is:")
        PrintValues(encryptedSecret)

        ' Decrypt the data and store in a byte array.
        Dim originalData As Byte() = Unprotect(encryptedSecret)
        Console.WriteLine("{0}The original data is:", Environment.NewLine)
        PrintValues(originalData)

    End Sub


    Public Shared Function Protect(ByVal data() As Byte) As Byte()
        Try
            ' Encrypt the data using DataProtectionScope.CurrentUser. The result can be decrypted
            '  only by the same current user.
            Return ProtectedData.Protect(data, s_additionalEntropy, DataProtectionScope.CurrentUser)
        Catch e As CryptographicException
            Console.WriteLine("Data was not encrypted. An error occurred.")
            Console.WriteLine(e.ToString())
            Return Nothing
        End Try

    End Function


    Public Shared Function Unprotect(ByVal data() As Byte) As Byte()
        Try
            'Decrypt the data using DataProtectionScope.CurrentUser.
            Return ProtectedData.Unprotect(data, s_additionalEntropy, DataProtectionScope.CurrentUser)
        Catch e As CryptographicException
            Console.WriteLine("Data was not decrypted. An error occurred.")
            Console.WriteLine(e.ToString())
            Return Nothing
        End Try

    End Function


    Public Shared Sub PrintValues(ByVal myArr() As [Byte])
        Dim i As [Byte]
        For Each i In myArr
            Console.Write(vbTab + "{0}", i)
        Next i
        Console.WriteLine()

    End Sub
End Class

Комментарии

Этот класс предоставляет доступ к API защиты данных (DPAPI), доступному в операционных системах Windows.This class provides access to the Data Protection API (DPAPI) available in Windows operating systems. Это служба, предоставляемая операционной системой и не требующая дополнительных библиотек.This is a service that is provided by the operating system and does not require additional libraries. Он обеспечивает защиту с помощью учетных данных пользователя или компьютера для шифрования или расшифровки данных.It provides protection using the user or machine credentials to encrypt or decrypt data.

Важно!

Поскольку он зависит от DPAPI, ProtectedData класс поддерживается только на платформе Windows.Because it depends on DPAPI, the ProtectedData class is supported on the Windows platform only. Его использование в .NET Core на платформах, отличных от Windows, вызывает исключение PlatformNotSupportedException .Its use on .NET Core on platforms other than Windows throws a PlatformNotSupportedException.

Класс состоит из двух оболочек для неуправляемого интерфейса DPAPI Protect и Unprotect .The class consists of two wrappers for the unmanaged DPAPI, Protect and Unprotect. Эти два метода можно использовать для шифрования и расшифровки данных, таких как пароли, ключи и строки подключения.These two methods can be used to encrypt and decrypt data such as passwords, keys, and connection strings.

При использовании этих методов во время олицетворения может появиться следующая ошибка: "ключ недопустим для использования в указанном состоянии".If you use these methods during impersonation, you may receive the following error: "Key not valid for use in specified state." Это происходит потому, что DPAPI хранит ключевые данные в профилях пользователей.This occurs because the DPAPI stores the key data in user profiles. Если профиль не загружен, DPAPI не сможет выполнить расшифровку.If the profile is not loaded, DPAPI won't be able to perform the decryption. Чтобы избежать этой ошибки, перед вызовом любого метода загрузите профиль пользователя, которого необходимо олицетворить.To prevent this error, load the profile of the user you want to impersonate before calling either method. Использование DPAPI с олицетворением может существенно усложняется и требует тщательного выбора.Using DPAPI with impersonation can incur significant complication and requires careful design choices.

Методы

Protect(Byte[], Byte[], DataProtectionScope)

Зашифровывает данные в заданном массиве байтов и возвращает массив байтов, содержащий зашифрованные данные.Encrypts the data in a specified byte array and returns a byte array that contains the encrypted data.

Unprotect(Byte[], Byte[], DataProtectionScope)

Расшифровывает данные в заданном массиве байтов и возвращает массив байтов, содержащий расшифрованные данные.Decrypts the data in a specified byte array and returns a byte array that contains the decrypted data.

Применяется к