Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini memberikan gambaran umum tentang metode dan praktik enkripsi yang didukung oleh .NET, termasuk manifes ClickOnce.
Pengantar kriptografi
Jaringan publik seperti Internet tidak menyediakan sarana komunikasi yang aman antar entitas. Komunikasi melalui jaringan tersebut rentan dibaca atau bahkan dimodifikasi oleh pihak ketiga yang tidak sah. Kriptografi membantu melindungi data agar tidak dilihat, menyediakan cara untuk mendeteksi apakah data telah dimodifikasi, dan membantu menyediakan cara komunikasi yang aman melalui saluran yang tidak aman. Misalnya, data dapat dienkripsi dengan menggunakan algoritma kriptografi, ditransmisikan dalam status terenkripsi, dan kemudian didekripsi oleh pihak yang dimaksud. Jika pihak ketiga mencegat data terenkripsi, akan sulit untuk menguraikannya.
Di .NET, kelas di System.Security.Cryptography namespace mengelola banyak detail kriptografi untuk Anda. Beberapa adalah pembungkus untuk implementasi sistem operasi, sementara yang lain adalah implementasi yang dikelola murni. Anda tidak perlu menjadi ahli dalam kriptografi untuk menggunakan kelas-kelas ini. Saat Anda membuat instans baru dari salah satu kelas algoritma enkripsi, kunci dibuat secara otomatis untuk kemudahan penggunaan, dan properti default dibuat seaman dan seaman mungkin.
Primitif Kriptografi
Dalam situasi umum di mana kriptografi digunakan, dua pihak (Alice dan Bob) berkomunikasi melalui saluran yang tidak aman. Alice dan Bob ingin memastikan bahwa komunikasi mereka tetap tidak dapat dipahami oleh siapa pun yang mungkin mendengarkan. Selain itu, karena Alice dan Bob berada di lokasi terpencil, Alice harus memastikan bahwa informasi yang diterimanya dari Bob belum dimodifikasi oleh siapa pun selama transmisi. Selain itu, dia harus memastikan bahwa informasi itu benar-benar berasal dari Bob dan bukan dari seseorang yang meniru Bob.
Kriptografi digunakan untuk mencapai tujuan berikut:
Kerahasiaan: Untuk membantu melindungi identitas atau data pengguna agar tidak dibaca.
Integritas data: Untuk membantu melindungi data agar tidak diubah.
Autentikasi: Untuk memastikan bahwa data berasal dari pihak tertentu.
Pencegahan Pengingkaran: Untuk mencegah pihak tertentu mengingkari bahwa mereka mengirim pesan.
Untuk mencapai tujuan ini, Anda dapat menggunakan kombinasi algoritma dan praktik yang dikenal sebagai primitif kriptografi untuk membuat skema kriptografi. Tabel berikut mencantumkan primitif kriptografi dan penggunaannya.
Primitif Kriptografi | Gunakan |
---|---|
Enkripsi kunci rahasia (kriptografi simetris) | Melakukan transformasi pada data agar tidak dibaca oleh pihak ketiga. Jenis enkripsi ini menggunakan satu kunci rahasia bersama untuk mengenkripsi dan mendekripsi data. |
Enkripsi kunci publik (kriptografi asimetris) | Melakukan transformasi pada data agar tidak dibaca oleh pihak ketiga. Jenis enkripsi ini menggunakan pasangan kunci publik/privat untuk mengenkripsi dan mendekripsi data. |
Penandatanganan kriptografi | Membantu memverifikasi bahwa data berasal dari pihak tertentu dengan membuat tanda tangan digital yang unik untuk pihak tersebut. Proses ini juga menggunakan fungsi hash. |
Hash kriptografi | Mengubah data berapapun panjangnya menjadi urutan byte dengan panjang tetap. Hash bersifat unik secara statistik; urutan dua byte yang berbeda tidak akan menghasilkan hash ke nilai yang sama. |
Enkripsi Secret-Key
Algoritma enkripsi kunci rahasia menggunakan satu kunci rahasia untuk mengenkripsi dan mendekripsi data. Anda harus mengamankan kunci dari akses oleh agen yang tidak sah, karena pihak mana pun yang memiliki kunci dapat menggunakannya untuk mendekripsi data Anda atau mengenkripsi data mereka sendiri, mengklaimnya berasal dari Anda.
Enkripsi kunci rahasia juga disebut sebagai enkripsi simetris karena kunci yang sama digunakan untuk enkripsi dan dekripsi. Algoritma enkripsi kunci rahasia sangat cepat (dibandingkan dengan algoritma kunci publik) dan sangat cocok untuk melakukan transformasi kriptografi pada aliran data yang besar. Algoritma enkripsi asimetris seperti RSA dibatasi secara matematis dalam berapa banyak data yang dapat mereka enkripsi. Algoritma enkripsi simetris umumnya tidak memiliki masalah tersebut.
Jenis algoritma kunci rahasia yang disebut cipher blok digunakan untuk mengenkripsi satu blok data pada satu waktu. Blokir cipher seperti Data Encryption Standard (DES), TripleDES, dan Advanced Encryption Standard (AES) secara kriptografi mengubah blok input n byte menjadi blok output byte terenkripsi. Jika Anda ingin mengenkripsi atau mendekripsi urutan byte, Anda harus melakukannya blok demi blok. Karena n kecil (8 byte untuk DES dan TripleDES; 16 byte [default], 24 byte, atau 32 byte untuk AES), nilai data yang lebih besar dari n harus dienkripsi satu blok sekaligus. Nilai data yang lebih kecil dari n harus diperluas ke n agar dapat diproses.
Salah satu bentuk cipher blok sederhana disebut mode buku kode elektronik (ECB). Mode ECB tidak dianggap aman, karena tidak menggunakan vektor inisialisasi untuk menginisialisasi blok teks biasa pertama. Untuk kunci rahasia tertentu k, cipher blok sederhana yang tidak menggunakan vektor inisialisasi akan mengenkripsi blok input teks biasa yang sama ke blok output ciphertext yang sama. Oleh karena itu, jika Anda memiliki blok duplikat dalam aliran teks biasa input, Anda akan memiliki blok duplikat dalam aliran ciphertext output Anda. Blok output duplikat ini mengindikasikan kepada pengguna yang tidak sah tentang enkripsi yang lemah, algoritma yang digunakan, dan kemungkinan mode serangan. Oleh karena itu, mode sandi ECB cukup rentan terhadap analisis, dan pada akhirnya, penemuan kunci.
Kelas cipher blok yang disediakan di pustaka kelas dasar menggunakan mode rantai default yang disebut cipher-block chaining (CBC), meskipun Anda dapat mengubah default ini jika Anda mau.
Cipher CBC mengatasi masalah yang terkait dengan cipher ECB dengan menggunakan vektor inisialisasi (IV) untuk mengenkripsi blok pertama teks biasa. Setiap blok teks biasa berikutnya menjalani operasi OR eksklusif bitwise (XOR
) dengan blok ciphertext sebelumnya sebelum dienkripsi. Oleh karena itu, setiap blok ciphertext bergantung pada semua blok sebelumnya. Ketika sistem ini digunakan, header pesan umum yang mungkin diketahui oleh pengguna yang tidak sah tidak dapat digunakan untuk merekayasa balik kunci.
Salah satu cara untuk membahayakan data yang dienkripsi dengan cipher CBC adalah dengan melakukan pencarian lengkap dari setiap kunci yang mungkin. Tergantung pada ukuran kunci yang digunakan untuk melakukan enkripsi, pencarian semacam ini sangat memakan waktu menggunakan bahkan komputer tercepat dan oleh karena itu tidak layak. Ukuran kunci yang lebih besar lebih sulit untuk diurai. Meskipun enkripsi tidak membuatnya secara teoritis tidak mustahil bagi pihak lawan untuk mengambil data terenkripsi, ini meningkatkan biaya untuk melakukan hal ini. Jika dibutuhkan tiga bulan untuk melakukan pencarian lengkap untuk mengambil data yang bermakna hanya selama beberapa hari, metode pencarian lengkap tidak praktis.
Kerugian dari enkripsi kunci rahasia adalah bahwa ia mengasumsikan bahwa dua pihak telah menyepakati kunci dan IV, dan mengkomunikasikan nilai-nilai mereka. IV tidak dianggap sebagai rahasia dan dapat ditransmisikan dalam teks tanpa enkripsi bersama pesan. Namun, kunci harus dirahasiakan dari pengguna yang tidak sah. Karena masalah ini, enkripsi kunci rahasia sering digunakan bersama dengan enkripsi kunci publik untuk mengkomunikasikan nilai kunci dan IV secara privat.
Dengan asumsi bahwa Alice dan Bob adalah dua pihak yang ingin berkomunikasi melalui saluran yang tidak aman, mereka mungkin menggunakan enkripsi kunci rahasia sebagai berikut: Alice dan Bob setuju untuk menggunakan satu algoritma tertentu (AES, misalnya) dengan kunci dan IV tertentu. Alice menyusun pesan dan membuat aliran jaringan (mungkin pipa bernama atau email jaringan) untuk mengirim pesan. Selanjutnya, dia mengenkripsi teks menggunakan kunci dan IV, dan mengirim pesan terenkripsi dan IV ke Bob melalui intranet. Bob menerima teks terenkripsi dan mendekripsinya dengan menggunakan IV dan kunci yang telah disepakati sebelumnya. Jika transmisi dicegat, pencegat tidak dapat memulihkan pesan asli, karena mereka tidak tahu kuncinya. Dalam skenario ini, hanya kunci yang harus tetap rahasia. Dalam skenario dunia nyata, Alice atau Bob menghasilkan kunci rahasia dan menggunakan enkripsi kunci publik (asimetris) untuk mentransfer kunci rahasia (simetris) ke pihak lain. Untuk informasi selengkapnya tentang enkripsi kunci publik, lihat bagian berikutnya.
.NET menyediakan kelas berikut yang menerapkan algoritma enkripsi kunci rahasia:
HMACSHA256, HMACSHA384 dan HMACSHA512. (Ini adalah algoritma kunci rahasia secara teknis karena mewakili kode autentikasi pesan yang dihitung dengan menggunakan fungsi hash kriptografi yang dikombinasikan dengan kunci rahasia. Lihat Nilai Hash, nanti di artikel ini.)
Enkripsi Public-Key
Enkripsi kunci publik menggunakan kunci privat yang harus dirahasiakan dari pengguna yang tidak sah dan kunci publik yang dapat di publikkan kepada siapa saja. Kunci publik dan kunci privat ditautkan secara matematis; data yang dienkripsi dengan kunci publik hanya dapat didekripsi dengan kunci privat, dan data yang ditandatangani dengan kunci privat hanya dapat diverifikasi dengan kunci publik. Kunci umum dapat disediakan untuk siapa saja; ini digunakan untuk mengenkripsi data yang akan dikirim ke penjaga kunci privat. Algoritma kriptografi kunci publik juga dikenal sebagai algoritma asimetris karena satu kunci diperlukan untuk mengenkripsi data, dan kunci lain diperlukan untuk mendekripsi data. Aturan kriptografi dasar melarang penggunaan kembali kunci, dan kedua kunci harus unik untuk setiap sesi komunikasi. Namun, dalam praktiknya, kunci asimetris umumnya berumur panjang.
Dua pihak (Alice dan Bob) mungkin menggunakan enkripsi kunci publik sebagai berikut: Pertama, Alice menghasilkan pasangan kunci publik/privat. Jika Bob ingin mengirim pesan terenkripsi kepada Alice, dia meminta kunci publik dari Alice. Alice mengirim bob kunci publiknya melalui jaringan yang tidak aman, dan Bob menggunakan kunci ini untuk mengenkripsi pesan. Bob mengirim pesan terenkripsi ke Alice, dan dia mendekripsinya dengan menggunakan kunci pribadinya. Jika Bob menerima kunci Alice melalui saluran yang tidak aman, seperti jaringan publik, Bob terbuka untuk serangan man-in-the-middle. Oleh karena itu, Bob harus memverifikasi dengan Alice bahwa dia memiliki salinan kunci umum yang benar.
Selama transmisi kunci publik Alice, agen yang tidak sah mungkin mencegat kunci. Selain itu, agen yang sama mungkin mencegat pesan terenkripsi dari Bob. Namun, agen tidak dapat mendekripsi pesan dengan kunci publik. Pesan hanya dapat didekripsi dengan kunci privat Alice, yang belum dikirimkan. Alice tidak menggunakan kunci privatnya untuk mengenkripsi pesan balasan ke Bob, karena siapa pun dengan kunci publik dapat mendekripsi pesan. Jika Alice ingin mengirim pesan kembali ke Bob, dia meminta bob untuk kunci umumnya dan mengenkripsi pesannya menggunakan kunci umum itu. Bob kemudian mendekripsi pesan menggunakan kunci privat terkait.
Dalam skenario ini, Alice dan Bob menggunakan enkripsi kunci publik (asimetris) untuk mentransfer kunci rahasia (simetris) dan menggunakan enkripsi kunci rahasia untuk sisa sesi mereka.
Daftar berikut menawarkan perbandingan antara algoritma kriptografi kunci publik dan kunci rahasia:
Algoritma kriptografi kunci publik menggunakan ukuran buffer tetap, sedangkan algoritma kriptografi kunci rahasia menggunakan buffer panjang variabel.
Algoritma kunci publik tidak dapat digunakan untuk menautkan data bersama-sama ke aliran seperti yang dapat dilakukan algoritma kunci rahasia, karena hanya sejumlah kecil data yang dapat dienkripsi. Oleh karena itu, operasi asimetris tidak menggunakan model streaming yang sama dengan operasi simetris.
Enkripsi kunci publik memiliki ruang kunci yang jauh lebih besar (rentang nilai yang mungkin untuk kunci) daripada enkripsi kunci rahasia. Oleh karena itu, enkripsi kunci publik kurang rentan terhadap serangan lengkap yang mencoba setiap kunci yang mungkin.
Kunci publik mudah didistribusikan karena tidak harus diamankan, asalkan ada beberapa cara untuk memverifikasi identitas pengirim.
Beberapa algoritma kunci publik (seperti RSA dan DSA, tetapi tidak Diffie-Hellman) dapat digunakan untuk membuat tanda tangan digital untuk memverifikasi identitas pengirim data.
Algoritma kunci publik sangat lambat dibandingkan dengan algoritma kunci rahasia, dan tidak dirancang untuk mengenkripsi data dalam jumlah besar. Algoritma kunci publik hanya berguna untuk mentransfer data dalam jumlah yang sangat kecil. Biasanya, enkripsi kunci publik digunakan untuk mengenkripsi kunci dan IV yang akan digunakan oleh algoritma kunci rahasia. Setelah kunci dan IV ditransfer, enkripsi kunci rahasia digunakan untuk sisa sesi.
.NET menyediakan kelas berikut yang menerapkan algoritma kunci publik:
RSA memungkinkan enkripsi dan penandatanganan, tetapi DSA hanya dapat digunakan untuk penandatanganan. DSA tidak seaman RSA, dan kami merekomendasikan RSA. Diffie-Hellman hanya dapat digunakan untuk pembuatan kunci. Secara umum, algoritma kunci publik lebih terbatas dalam penggunaannya daripada algoritma kunci privat.
Tanda Tangan Digital
Algoritma kunci publik juga dapat digunakan untuk membentuk tanda tangan digital. Tanda tangan digital mengautentikasi identitas pengirim (jika Anda mempercayai kunci umum pengirim) dan membantu melindungi integritas data. Dengan menggunakan kunci publik yang dihasilkan oleh Alice, penerima data Alice dapat memverifikasi bahwa Alice mengirimkannya dengan membandingkan tanda tangan digital dengan data Alice dan kunci publik Alice.
Untuk menggunakan kriptografi kunci publik untuk menandatangani pesan secara digital, Alice terlebih dahulu menggunakan algoritma hash pada pesan untuk membuat ringkasan pesan. Ikhtisar pesan adalah representasi data yang ringkas dan unik. Alice kemudian mengenkripsi ringkasan pesan dengan kunci pribadinya untuk membuat tanda tangan pribadi. Setelah menerima pesan dan tanda tangan, Bob mendekripsi tanda tangan menggunakan kunci publik Alice untuk memulihkan ringkasan pesan dan kemudian melakukan hashing pada pesan menggunakan algoritma hash yang sama yang digunakan Alice. Jika ringkasan pesan yang dihitung oleh Bob persis sama dengan ringkasan pesan yang diterima dari Alice, Bob yakin bahwa pesan tersebut berasal dari pemilik kunci privat dan bahwa data belum dimodifikasi. Jika Bob percaya bahwa Alice adalah pemilik kunci privat, dia tahu bahwa pesan itu berasal dari Alice.
Nota
Tanda tangan dapat diverifikasi oleh siapa pun karena kunci umum pengirim adalah pengetahuan umum dan biasanya disertakan dalam format tanda tangan digital. Metode ini tidak mempertahankan kepastian pesan; agar pesan menjadi rahasia, pesan juga harus dienkripsi.
.NET menyediakan kelas berikut yang menerapkan algoritma tanda tangan digital:
Nilai Hash
Algoritma hash memetakan nilai biner dengan panjang arbitrer ke nilai biner yang lebih kecil dengan panjang tetap, yang dikenal sebagai nilai hash. Nilai hash adalah representasi numerik dari sepotong data. Jika Anda hash paragraf teks biasa dan mengubah bahkan satu huruf paragraf, hash berikutnya akan menghasilkan nilai yang berbeda. Jika hash kuat secara kriptografis, nilainya akan berubah secara signifikan. Misalnya, jika satu bit pesan diubah, fungsi hash yang kuat dapat menghasilkan output yang berbeda sebesar 50 persen. Banyak nilai input dapat di-hash menjadi nilai output yang sama. Namun, secara komputasi tidak memungkinkan untuk menemukan dua masukan berbeda yang di-hash ke nilai yang sama.
Dua pihak (Alice dan Bob) dapat menggunakan fungsi hash untuk memastikan integritas pesan. Mereka akan memilih algoritma hash untuk menandatangani pesan mereka. Alice akan menulis pesan, lalu membuat hash pesan tersebut dengan menggunakan algoritma yang dipilih. Mereka kemudian akan mengikuti salah satu metode berikut:
Alice mengirim pesan teks biasa dan pesan hash (tanda tangan digital) ke Bob. Bob menerima pesan, mengubahnya menjadi hash, dan membandingkan nilai hashnya dengan nilai hash yang diterimanya dari Alice. Jika nilai hash identik, pesan tidak diubah. Jika nilainya tidak identik, pesan diubah setelah Alice menulisnya.
Sayangnya, metode ini tidak menetapkan keaslian pengirim. Siapa pun dapat meniru Alice dan mengirim pesan ke Bob. Mereka dapat menggunakan algoritma hash yang sama untuk menandatangani pesan mereka, dan semua yang dapat ditentukan Bob adalah bahwa pesan cocok dengan tanda tangannya. Ini adalah salah satu bentuk serangan man-in-the-middle. Untuk informasi selengkapnya, lihat Contoh Komunikasi Aman Cryptography Next Generation (CNG).
Alice mengirim pesan teks biasa ke Bob melalui saluran publik yang tidak aman. Dia mengirim pesan hash ke Bob melalui saluran pribadi yang aman. Bob menerima pesan teks biasa, melakukan hash pada pesan tersebut, dan membandingkan hash dengan hash yang ditukar secara privat. Jika hash cocok, Bob tahu dua hal:
Pesan tidak diubah.
Pengirim pesan (Alice) otentik.
Agar sistem ini berfungsi, Alice harus menyembunyikan nilai hash aslinya dari semua pihak kecuali Bob.
Alice mengirim pesan teks biasa ke Bob melalui saluran publik yang tidak aman dan menempatkan pesan hash di situs Web yang dapat dilihat publiknya.
Metode ini mencegah pengubahan pesan dengan mencegah siapa pun mengubah nilai hash. Meskipun pesan dan hashnya dapat dibaca oleh siapa pun, nilai hash hanya dapat diubah oleh Alice. Penyerang yang ingin meniru Alice akan memerlukan akses ke situs Web Alice.
Tidak ada metode sebelumnya yang akan mencegah seseorang membaca pesan Alice, karena dikirimkan dalam teks biasa. Keamanan penuh biasanya memerlukan tanda tangan digital (penandatanganan pesan) dan enkripsi.
.NET menyediakan kelas berikut yang menerapkan algoritma hash:
.NET juga menyediakan MD5 dan SHA1. Tetapi algoritma MD5 dan SHA-1 telah ditemukan tidak aman, dan SHA-2 sekarang direkomendasikan sebagai gantinya. SHA-2 mencakup SHA256, SHA384, dan SHA512.
Pembuatan Angka Acak
Pembuatan angka acak merupakan integral dari banyak operasi kriptografi. Misalnya, kunci kriptografi harus se acak mungkin sehingga tidak layak untuk mereproduksinya. Generator angka acak kriptografi harus menghasilkan output yang secara komputasi tidak layak untuk diprediksi dengan probabilitas yang lebih baik dari satu setengah. Oleh karena itu, metode apa pun untuk memprediksi bit output berikutnya tidak boleh berkinerja lebih baik daripada tebakan acak. Kelas di .NET menggunakan generator angka acak untuk menghasilkan kunci kriptografi.
Kelas RandomNumberGenerator ini adalah implementasi algoritma generator angka acak.
Manifest ClickOnce
Kelas kriptografi berikut memungkinkan Anda mendapatkan dan memverifikasi informasi tentang tanda tangan manifes untuk aplikasi yang disebarkan menggunakan teknologi ClickOnce:
Kelas ManifestSignatureInformation mendapatkan informasi tentang signature manifes ketika Anda menggunakan overload metode VerifySignature.
Anda dapat menggunakan ManifestKinds enumerasi untuk menentukan manifes mana yang akan diverifikasi. Hasil verifikasi adalah sebuah nilai enumerasi SignatureVerificationResult.
Kelas ManifestSignatureInformationCollection menyediakan kumpulan objek baca-saja ManifestSignatureInformation dari tanda tangan terverifikasi.
Selain itu, kelas berikut memberikan informasi tanda tangan tertentu:
StrongNameSignatureInformation menyimpan informasi tanda tangan nama yang kuat untuk manifes.
AuthenticodeSignatureInformation mewakili informasi tanda tangan Authenticode untuk manifes.
TimestampInformation berisi informasi tentang stempel waktu pada tanda tangan Authenticode.
TrustStatus menyediakan cara sederhana untuk memeriksa apakah tanda tangan Authenticode tepercaya.
Kelas Kryptografi Generasi Selanjutnya (CNG)
Kelas Cryptography Next Generation (CNG) menyediakan pembungkus terkelola di sekitar fungsi CNG asli. (CNG adalah pengganti CryptoAPI.) Kelas-kelas ini memiliki "Cng" sebagai bagian dari nama mereka. Kunci dari kelas pembungkus CNG adalah CngKey kelas kontainer kunci, yang mengabstraksi penyimpanan dan penggunaan kunci CNG. Kelas ini memungkinkan Anda menyimpan pasangan kunci atau kunci publik dengan aman dan merujuknya dengan menggunakan nama string sederhana. Kelas tanda tangan berbasis ECDsaCng kurva elips dan ECDiffieHellmanCng kelas enkripsi dapat menggunakan CngKey objek.
Kelas CngKey ini digunakan untuk berbagai operasi tambahan, termasuk membuka, membuat, menghapus, dan mengekspor kunci. Ini juga menyediakan akses ke handle kunci dasar yang dapat digunakan saat memanggil fungsi asli secara langsung.
.NET juga mencakup berbagai kelas CNG pendukung, seperti berikut ini:
CngProvider mempertahankan penyedia penyimpanan utama.
CngAlgorithm mengelola algoritma CNG.
CngProperty mempertahankan properti kunci yang sering digunakan.
Lihat juga
- Model Kriptografi - Menjelaskan bagaimana kriptografi diterapkan di pustaka kelas dasar.
- Kriptografi Antar Platform
- Kerentanan waktu dengan dekripsi simetris dalam mode CBC menggunakan padding
- ASP.NET Core Perlindungan Data