Langage
Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Note
Cet article s’applique à Windows.
Pour plus d’informations sur ASP.NET Core, consultez ASP.NET Core Protection des données.
.NET fournit l’accès à l’API de protection des données (DPAPI), qui vous permet de chiffrer des données à l’aide d’informations provenant du compte d’utilisateur ou de l’ordinateur actuel. Lorsque vous utilisez DPAPI, vous évitez le problème difficile de générer et de stocker explicitement une clé de chiffrement.
Utilisez la ProtectedData classe pour chiffrer une copie d’un tableau d’octets. Vous pouvez spécifier que seul le même compte d’utilisateur peut déchiffrer les données, ou que n’importe quel compte sur l’ordinateur peut le déchiffrer. Pour obtenir une description détaillée des ProtectedData options, consultez l’énumération DataProtectionScope .
Chiffrer des données dans un fichier ou un flux à l’aide de la protection des données
Créez une entropie aléatoire.
Appelez la méthode statique Protect en passant un tableau d'octets à chiffrer, l'entropie et la portée de protection des données.
Écrivez les données chiffrées dans un fichier ou un flux.
Pour déchiffrer des données à partir d’un fichier ou d’un flux à l’aide de la protection des données
Lit les données chiffrées à partir d’un fichier ou d’un flux.
Appelez la méthode statique Unprotect en passant un tableau d'octets à déchiffrer et la portée de protection des données.
Exemple
L’exemple de code suivant montre deux formes de chiffrement et de déchiffrement. Tout d’abord, le code chiffre, puis déchiffre un tableau en mémoire d’octets. Ensuite, le code chiffre une copie d’un tableau d’octets, l’enregistre dans un fichier, charge les données à partir du fichier, puis déchiffre les données. L’exemple affiche les données d’origine, les données chiffrées et les données déchiffrées.
Important
ProtectedMemoryest disponible uniquement pour .NET Framework. ProtectedDataest disponible sur .NET et .NET Framework.
Cet exemple compile et s’exécute lorsque vous ciblez .NET sur Windows. Pour compiler l’exemple, ajoutez le System.Security.Cryptography.ProtectedData package NuGet.
using System.Security.Cryptography;
using System.Text;
try
{
// Data Encryption - ProtectedData
// Create the original data to be encrypted.
byte[] toEncrypt = Encoding.ASCII.GetBytes("This is some data of any length.");
// Create some random entropy.
byte[] entropy = CreateRandomEntropy();
Console.WriteLine();
Console.WriteLine($"Original data: {Encoding.ASCII.GetString(toEncrypt)}");
Console.WriteLine("Encrypting and writing to disk...");
int bytesWritten;
// Encrypt a copy of the data to the stream.
using (FileStream writeStream = new("Data.dat", FileMode.OpenOrCreate))
{
bytesWritten = EncryptDataToStream(toEncrypt, entropy, DataProtectionScope.CurrentUser, writeStream);
}
Console.WriteLine("Reading data from disk and decrypting...");
// Read from the stream and decrypt the data.
byte[] decryptData;
using (FileStream readStream = new("Data.dat", FileMode.Open))
{
decryptData = DecryptDataFromStream(entropy, DataProtectionScope.CurrentUser, readStream, bytesWritten);
}
Console.WriteLine($"Decrypted data: {Encoding.ASCII.GetString(decryptData)}");
}
catch (Exception e)
{
Console.WriteLine($"ERROR: {e.Message}");
}
static byte[] CreateRandomEntropy()
{
// Create a byte array to hold the random value and fill it with a random value.
byte[] entropy = new byte[16];
RandomNumberGenerator.Fill(entropy);
return entropy;
}
static int EncryptDataToStream(byte[] buffer, byte[] entropy, DataProtectionScope scope, Stream stream)
{
ArgumentNullException.ThrowIfNull(buffer);
ArgumentOutOfRangeException.ThrowIfZero(buffer.Length, nameof(buffer));
ArgumentNullException.ThrowIfNull(entropy);
ArgumentOutOfRangeException.ThrowIfZero(entropy.Length, nameof(entropy));
ArgumentNullException.ThrowIfNull(stream);
int length = 0;
// Encrypt the data and store the result in a new byte array. The original data remains unchanged.
byte[] encryptedData = ProtectedData.Protect(buffer, entropy, scope);
// Write the encrypted data to a stream.
if (stream.CanWrite)
{
stream.Write(encryptedData, 0, encryptedData.Length);
length = encryptedData.Length;
}
// Return the length that was written to the stream.
return length;
}
static byte[] DecryptDataFromStream(byte[] entropy, DataProtectionScope scope, Stream stream, int length)
{
ArgumentNullException.ThrowIfNull(stream);
ArgumentOutOfRangeException.ThrowIfZero(length, nameof(length));
ArgumentNullException.ThrowIfNull(entropy);
ArgumentOutOfRangeException.ThrowIfZero(entropy.Length, nameof(entropy));
if (!stream.CanRead)
throw new IOException("Could not read the stream.");
byte[] inBuffer = new byte[length];
stream.ReadExactly(inBuffer, 0, length);
// Return the decrypted data.
return ProtectedData.Unprotect(inBuffer, entropy, scope);
}
Imports System.IO
Imports System.Security.Cryptography
Imports System.Text
Public Module DataProtectionSample
Sub Main()
Try
' Data Encryption - ProtectedData
' Create the original data to be encrypted.
Dim toEncrypt As Byte() = Encoding.ASCII.GetBytes("This is some data of any length.")
' Create some random entropy.
Dim entropy As Byte() = CreateRandomEntropy()
Console.WriteLine()
Console.WriteLine($"Original data: {Encoding.ASCII.GetString(toEncrypt)}")
Console.WriteLine("Encrypting and writing to disk...")
Dim bytesWritten As Integer
' Encrypt a copy of the data to the stream.
Using writeStream As New FileStream("Data.dat", FileMode.OpenOrCreate)
bytesWritten = EncryptDataToStream(toEncrypt, entropy, DataProtectionScope.CurrentUser, writeStream)
End Using
Console.WriteLine("Reading data from disk and decrypting...")
' Read from the stream and decrypt the data.
Dim decryptData As Byte()
Using readStream As New FileStream("Data.dat", FileMode.Open)
decryptData = DecryptDataFromStream(entropy, DataProtectionScope.CurrentUser, readStream, bytesWritten)
End Using
Console.WriteLine($"Decrypted data: {Encoding.ASCII.GetString(decryptData)}")
Catch e As Exception
Console.WriteLine($"ERROR: {e.Message}")
End Try
End Sub
Function CreateRandomEntropy() As Byte()
' Create a byte array to hold the random value and fill it with a random value.
Dim entropy(15) As Byte
RandomNumberGenerator.Fill(entropy)
Return entropy
End Function
Function EncryptDataToStream(buffer As Byte(), entropy As Byte(), scope As DataProtectionScope, stream As Stream) As Integer
ArgumentNullException.ThrowIfNull(buffer)
ArgumentOutOfRangeException.ThrowIfZero(buffer.Length, NameOf(buffer))
ArgumentNullException.ThrowIfNull(entropy)
ArgumentOutOfRangeException.ThrowIfZero(entropy.Length, NameOf(entropy))
ArgumentNullException.ThrowIfNull(stream)
Dim length As Integer = 0
' Encrypt the data and store the result in a new byte array. The original data remains unchanged.
Dim encryptedData As Byte() = ProtectedData.Protect(buffer, entropy, scope)
' Write the encrypted data to a stream.
If stream.CanWrite Then
stream.Write(encryptedData, 0, encryptedData.Length)
length = encryptedData.Length
End If
' Return the length that was written to the stream.
Return length
End Function
Function DecryptDataFromStream(entropy As Byte(), scope As DataProtectionScope, stream As Stream, length As Integer) As Byte()
ArgumentNullException.ThrowIfNull(stream)
ArgumentOutOfRangeException.ThrowIfZero(length, NameOf(length))
ArgumentNullException.ThrowIfNull(entropy)
ArgumentOutOfRangeException.ThrowIfZero(entropy.Length, NameOf(entropy))
If Not stream.CanRead Then
Throw New IOException("Could not read the stream.")
End If
Dim inBuffer(length - 1) As Byte
stream.ReadExactly(inBuffer, 0, length)
' Return the decrypted data.
Return ProtectedData.Unprotect(inBuffer, entropy, scope)
End Function
End Module