Kryptografický model .NET
.NET poskytuje implementace mnoha standardních kryptografických algoritmů.
Dědičnost objektů
Kryptografický systém .NET implementuje rozšiřitelný vzor dědičnosti odvozené třídy. Hierarchie je následující:
Třída typu algoritmu, například SymmetricAlgorithm, AsymmetricAlgorithmnebo HashAlgorithm. Tato úroveň je abstraktní.
Třída algoritmu, která dědí z třídy typu algoritmu, Aesnapříklad , RSAnebo ECDiffieHellman. Tato úroveň je abstraktní.
Implementace třídy algoritmu, která dědí z třídy algoritmu, AesManagednapříklad , , RC2CryptoServiceProvidernebo ECDiffieHellmanCng. Tato úroveň je plně implementována.
Tento model odvozených tříd umožňuje přidat nový algoritmus nebo novou implementaci existujícího algoritmu. Například k vytvoření nového algoritmu veřejného klíče byste dědili z AsymmetricAlgorithm třídy. Chcete-li vytvořit novou implementaci konkrétního algoritmu, vytvoříte ne abstraktní odvozenou třídu tohoto algoritmu.
V budoucnu se tento model dědičnosti nepoužívá pro nové druhy primitiv jako AesGcm nebo Shake128. Tyto algoritmy jsou sealed
. Pokud u těchto typů potřebujete vzor rozšiřitelnosti nebo abstrakci, je implementace abstrakce zodpovědností vývojáře.
Rozhraní API s jedním snímkem
Od .NET 5 se pro hashování a HMAC zavedla jednodušší rozhraní API. I když jsou mírně méně flexibilní, tato jednostřelová rozhraní API:
- Je jednodušší používat (a méně náchylné k zneužití)
- Snížit přidělení nebo jsou přidělení zdarma
- Jsou vlákno bezpečné
- Použití nejlepší dostupné implementace pro platformu
Primitivní hodnoty hash a HMAC zpřístupňují jednorázové rozhraní API prostřednictvím statické HashData
metody pro typ, například SHA256.HashData. Statická rozhraní API nenabízí žádný integrovaný mechanismus rozšiřitelnosti. Pokud implementujete vlastní algoritmy, doporučujeme nabídnout podobná statická rozhraní API tohoto algoritmu.
Třída RandomNumberGenerator také nabízí statické metody pro vytváření nebo vyplňování vyrovnávacích pamětí kryptografickými náhodnými daty. Tyto metody vždy používají kryptograficky zabezpečený pseudorandomní generátor čísel systému (CSPRNG).
Způsob implementace algoritmů v .NET
Jako příklad různých implementací dostupných pro algoritmus zvažte symetrické algoritmy. Základem pro všechny symetrické algoritmy je SymmetricAlgorithm, který je zděděný AesTripleDES, a další, které se již nedoporučují.
Aes je zděděna pomocí AesCryptoServiceProvider, AesCnga AesManaged.
V rozhraní .NET Framework ve Windows:
*CryptoServiceProvider
Třídy algoritmů, například AesCryptoServiceProvider, jsou obálky kolem implementace rozhraní API kryptografie systému Windows (CAPI) algoritmu.*Cng
Třídy algoritmů, například ECDiffieHellmanCng, jsou obálky kolem implementace CNG (Windows Cryptography Next Generation).*Managed
třídy, například AesManaged, jsou napsány zcela ve spravovaném kódu.*Managed
implementace nejsou certifikovány federálními standardy pro zpracování informací (FIPS) a mohou být pomalejší než*CryptoServiceProvider
třídy obálky*Cng
.
V .NET Core a .NET 5 a novějších verzích jsou všechny třídy implementace (*CryptoServiceProvider
*Managed
, a*Cng
) obálky pro algoritmy operačního systému (OS). Pokud jsou algoritmy operačního systému certifikované standardem FIPS, pak .NET používá algoritmy s certifikací FIPS. Další informace naleznete v tématu Kryptografie pro různé platformy.
Ve většině případů nemusíte přímo odkazovat na třídu implementace algoritmu, například AesCryptoServiceProvider
. Metody a vlastnosti, které obvykle potřebujete, jsou na základní třídě algoritmu, například Aes
. Vytvořte instanci výchozí třídy implementace pomocí metody továrny na základní třídě algoritmu a odkazujte na třídu základního algoritmu. Podívejte se například na zvýrazněný řádek kódu v následujícím příkladu:
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
Volba algoritmu
Můžete vybrat algoritmus z různých důvodů: například pro integritu dat, ochranu osobních údajů nebo vygenerovat klíč. Symetrické a hashovací algoritmy jsou určeny k ochraně dat z důvodů integrity (ochrana před změnou) nebo z důvodů ochrany osobních údajů (ochrana před zobrazením). Algoritmy hash se používají především pro integritu dat.
Tady je seznam doporučených algoritmů podle aplikace:
- Ochrana osobních údajů v datech:
- Integrita dat:
- Digitální podpis:
- Výměna klíčů:
- Generování náhodných čísel:
- Generování klíče z hesla: