.NET-titkosítási modell
A .NET számos szabványos titkosítási algoritmus implementálását biztosítja.
Objektumöröklés
A .NET titkosítási rendszer a származtatott osztályöröklés bővíthető mintáját valósítja meg. A hierarchia a következő:
Algoritmustípus-osztály, például SymmetricAlgorithm: , AsymmetricAlgorithmvagy HashAlgorithm. Ez a szint absztrakt.
Algoritmusosztály, amely egy algoritmustípus-osztálytól öröklődik, Aespéldául , RSAvagy ECDiffieHellman. Ez a szint absztrakt.
Algoritmusosztály implementálása, amely egy algoritmusosztálytól öröklődik, AesManagedpéldául , RC2CryptoServiceProvidervagy ECDiffieHellmanCng. Ez a szint teljes mértékben implementálva van.
Ez a származtatott osztályminta lehetővé teszi egy új algoritmus vagy egy meglévő algoritmus új implementációjának hozzáadását. Ha például egy új nyilvánoskulcs-algoritmust szeretne létrehozni, örökölné az AsymmetricAlgorithm osztályt. Egy adott algoritmus új implementációjának létrehozásához létre kell hoznia az algoritmus nem absztrakt származtatott osztályát.
Tovább haladva, ez az öröklési modell nem használatos az új típusú primitívek, mint vagy AesGcmShake128. Ezek az algoritmusok .sealed
Ha bővíthetőségi mintára vagy absztrakcióra van szüksége az ilyen típusok esetében, az absztrakció megvalósítása a fejlesztő feladata.
Egylövetű API-k
A .NET 5-től kezdve egyszerűbb API-kat vezettünk be a kivonatoláshoz és a HMAC-hoz. Bár kissé kevésbé rugalmasak, ezek az egylövetű API-k:
- Könnyebben használható (és kevésbé hajlamos a visszaélésre)
- Foglalások csökkentése vagy kiosztásmentesek
- Biztonságosak a szálak
- A platform számára elérhető legjobb implementáció használata
A kivonatolás és a HMAC primitívek egy egylövetű API-t fednek fel egy statikus HashData
módszerrel a típuson, például SHA256.HashData. A statikus API-k nem nyújtanak beépített bővíthetőségi mechanizmust. Ha saját algoritmusokat implementál, javasoljuk, hogy az algoritmushoz hasonló statikus API-kat is kínáljon.
Az RandomNumberGenerator osztály statikus metódusokat is kínál a pufferek titkosítási véletlenszerű adatokkal való létrehozásához vagy kitöltéséhez. Ezek a módszerek mindig a rendszer kriptográfiailag biztonságos pszeudorandom számgenerátorát (CSPRNG) használják.
Algoritmusok implementálása a .NET-ben
Az algoritmusok különböző implementációinak példájaként fontolja meg a szimmetrikus algoritmusokat. Az összes szimmetrikus algoritmus alapja az SymmetricAlgorithmöröklődő Aes, TripleDESés más, már nem ajánlott algoritmusok.
Aes örökli AesCryptoServiceProvidera , AesCngés AesManageda .
Windows .NET-keretrendszer esetén:
*CryptoServiceProvider
Az algoritmusosztályok, például AesCryptoServiceProvideraz algoritmusOk Windows Cryptography API (CAPI) implementációja körül burkolók.*Cng
Az algoritmusosztályok, például ECDiffieHellmanCnga Windows Cryptography Next Generation (CNG) implementációjának burkolói.*Managed
az osztályokat, például AesManagedaz osztályokat teljes egészében felügyelt kódban írják.*Managed
az implementációk nem rendelkeznek a Federal Information Processing Standards (FIPS) minősítésével, és lassabbak lehetnek, mint a*CryptoServiceProvider
*Cng
burkolóosztályok.
A .NET Core és a .NET 5 és újabb verziókban az összes implementációs osztály (*CryptoServiceProvider
*Managed
és *Cng
) az operációsrendszer-algoritmusok burkolói. Ha az operációsrendszer-algoritmusok FIPS-tanúsítvánnyal rendelkeznek, akkor a .NET FIPS-tanúsítvánnyal rendelkező algoritmusokat használ. További információ: Platformfüggetlen titkosítás.
A legtöbb esetben nem kell közvetlenül hivatkoznia egy algoritmus-implementációs osztályra, például AesCryptoServiceProvider
. Az általában szükséges metódusok és tulajdonságok az alap algoritmusosztályban találhatók, például Aes
. Hozzon létre egy alapértelmezett implementációs osztálypéldányt egy gyári módszerrel az alap algoritmusosztályon, és tekintse meg az alapszintű algoritmusosztályt. Lásd például a kiemelt kódsort a következő példában:
using System.Security.Cryptography;
try
{
using (FileStream fileStream = new("TestData.txt", FileMode.OpenOrCreate))
{
using (Aes aes = Aes.Create())
{
byte[] key =
{
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16
};
aes.Key = key;
byte[] iv = aes.IV;
fileStream.Write(iv, 0, iv.Length);
using (CryptoStream cryptoStream = new(
fileStream,
aes.CreateEncryptor(),
CryptoStreamMode.Write))
{
// By default, the StreamWriter uses UTF-8 encoding.
// To change the text encoding, pass the desired encoding as the second parameter.
// For example, new StreamWriter(cryptoStream, Encoding.Unicode).
using (StreamWriter encryptWriter = new(cryptoStream))
{
encryptWriter.WriteLine("Hello World!");
}
}
}
}
Console.WriteLine("The file was encrypted.");
}
catch (Exception ex)
{
Console.WriteLine($"The encryption failed. {ex}");
}
Imports System
Imports System.IO
Imports System.Security.Cryptography
Module Module1
Sub Main()
Try
' Create a file stream
Using fileStream As New FileStream("TestData.txt", FileMode.OpenOrCreate)
' Create a new instance of the default Aes implementation class
' and configure encryption key.
Using aes As Aes = Aes.Create()
'Encryption key used to encrypt the stream.
'The same value must be used to encrypt and decrypt the stream.
Dim key As Byte() = {
&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8,
&H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16
}
aes.Key = key
' Stores IV at the beginning of the file.
' This information will be used for decryption.
Dim iv As Byte() = aes.IV
fileStream.Write(iv, 0, iv.Length)
' Create a CryptoStream, pass it the FileStream, and encrypt
' it with the Aes class.
Using cryptoStream As New CryptoStream(fileStream, aes.CreateEncryptor(), CryptoStreamMode.Write)
' By default, the StreamWriter uses UTF-8 encoding.
' To change the text encoding, pass the desired encoding as the second parameter.
' For example, New StreamWriter(cryptoStream, Encoding.Unicode).
Using sWriter As New StreamWriter(cryptoStream)
'Write to the stream.
sWriter.WriteLine("Hello World!")
End Using
End Using
End Using
End Using
'Inform the user that the message was written
'to the stream.
Console.WriteLine("The text was encrypted.")
Catch
'Inform the user that an exception was raised.
Console.WriteLine("The encryption failed.")
Throw
End Try
End Sub
End Module
Algoritmus kiválasztása
Különböző okokból választhat algoritmust: például adatintegritás, adatvédelem vagy kulcs létrehozása céljából. A szimmetrikus és kivonatoló algoritmusok az adatok védelmére szolgálnak integritási okokból (védelem a változástól) vagy adatvédelmi okokból (védelem a megtekintéstől). A kivonatoló algoritmusokat elsősorban az adatintegritáshoz használják.
Íme az ajánlott algoritmusok listája alkalmazásonként:
- Adatvédelem:
- Adatintegritás:
- Digitális aláírás:
- Kulcscsere:
- Véletlenszerű szám generálása:
- Kulcs létrehozása jelszóból: