Model Kriptografi .NET
.NET menyediakan implementasi dari banyak algoritma kriptografi standar.
Pewarisan objek
Sistem kriptografi .NET mengimplementasikan pola pewarisan kelas turunan yang dapat diperluas. Hierarkinya adalah sebagai berikut:
Kelas jenis algoritma, seperti SymmetricAlgorithm, AsymmetricAlgorithm, atau HashAlgorithm. Tingkat ini abstrak.
Kelas algoritma yang mewarisi dari kelas jenis algoritma, misalnya, Aes, , RSAatau ECDiffieHellman. Tingkat ini abstrak.
Implementasi kelas algoritma yang mewarisi dari kelas algoritma, misalnya, , AesManaged, RC2CryptoServiceProvideratau ECDiffieHellmanCng. Tingkat ini sepenuhnya diimplementasikan.
Pola kelas turunan ini memungkinkan Anda menambahkan algoritma baru atau implementasi baru dari algoritma yang ada. Misalnya, untuk membuat algoritma kunci-publik baru, Anda akan mewarisi dari kelas AsymmetricAlgorithm. Misalnya, untuk membuat algoritma kunci publik baru, Anda akan membuat kelas turunan non-abstrak dar algoritma itu.
Ke depannya, model pewarisan ini tidak digunakan untuk jenis primitif baru seperti AesGcm atau Shake128. Algoritma ini adalah sealed
. Jika Anda memerlukan pola ekstensibilitas atau abstraksi atas jenis ini, implementasi abstraksi adalah tanggung jawab pengembang.
API satu tembakan
Mulai dari .NET 5, API yang lebih sederhana diperkenalkan untuk hashing dan HMAC. Meskipun sedikit kurang fleksibel, API satu bidikan ini:
- Lebih mudah digunakan (dan kurang rentan terhadap penyalahgunaan)
- Mengurangi alokasi atau bebas alokasi
- Apakah utas aman
- Gunakan implementasi terbaik yang tersedia untuk platform
Hashing dan HMAC primitif mengekspos API satu bidikan melalui metode statis HashData
pada jenisnya, seperti SHA256.HashData. API statis tidak menawarkan mekanisme ekstensibilitas bawaan. Jika Anda menerapkan algoritma Anda sendiri, disarankan untuk juga menawarkan API statis algoritma yang serupa.
Kelas ini RandomNumberGenerator juga menawarkan metode statis untuk membuat atau mengisi buffer dengan data acak kriptografi. Metode ini selalu menggunakan generator nomor pseudorandom yang aman secara kriptografis sistem (CSPRNG).
Bagaimana algoritma diimplementasikan dalam .NET
Sebagai contoh berbagai implementasi yang tersedia untuk algoritma, pertimbangkan algoritma simetris. Basis untuk semua algoritma simetris adalah SymmetricAlgorithm, yang diwarisi oleh Aes, TripleDES, dan lainnya yang tidak lagi direkomendasikan.
Aes diwariskan oleh AesCryptoServiceProvider, AesCng, dan AesManaged.
Di .NET Framework di Windows:
- Kelas algoritma,
*CryptoServiceProvider
seperti AesCryptoServiceProvider, adalah pembungkus di sekitar implementasi Windows Cryptography API (CAPI) dari algoritma. - Kelas algoritma
*Cng
, seperti ECDiffieHellmanCng, adalah pembungkus di sekitar implementasi Windows Cryptography Cryptography Next Generation (CNG). - Kelas
*Managed
, seperti AesManaged, ditulis sepenuhnya dalam kode terkelola. Implementasi*Managed
tidak disertifikasi oleh Standar Pemrosesan Informasi Federal (FIPS), dan mungkin lebih lambat dari kelas*CryptoServiceProvider
dan kelas pembungkus*Cng
.
Dalam .NET Core dan .NET 5 dan versi yang lebih baru, semua kelas implementasi (*CryptoServiceProvider
, *Managed
, dan *Cng
) adalah pembungkus untuk algoritma sistem operasi (OS). Jika algoritma OS bersertifikat FIPS, maka .NET menggunakan algoritma bersertifikat FIPS. Untuk informasi selengkapnya, lihat Kriptografi Lintas-Platform.
Dalam kebanyakan kasus, Anda tidak perlu langsung mereferensikan kelas implementasi algoritma, seperti AesCryptoServiceProvider
. Metode dan properti yang biasanya Anda butuhkan ada di kelas algoritma dasar, seperti Aes
. Buat instans kelas implementasi default dengan menggunakan metode pabrik pada kelas algoritma dasar, dan lihat kelas algoritma dasar. Misalnya, lihat baris kode yang disorot dalam contoh berikut:
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
Pilih algoritma
Anda dapat memilih algoritma karena alasan yang berbeda: misalnya, untuk integritas data, untuk privasi data, atau untuk menghasilkan kunci. Algoritma simetris dan hash ditujukan untuk melindungi data karena alasan integritas (lindungi dari perubahan) atau alasan privasi (lindungi dari tampilan). Algoritma hash digunakan terutama untuk integritas data.
Berikut adalah daftar algoritma yang direkomendasikan berdasarkan aplikasi:
- Privasi data:
- Integritas data:
- Tanda tangan digital:
- Pertukaran kunci:
- Pembuatan angka acak:
- Membuat kunci dari kata sandi: