.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ő:

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:

Lásd még