Sdílet prostřednictvím


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í:

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:

Viz také