Gambaran umum enkripsi, tanda tangan digital, dan algoritme hash di .NET

Artikel ini memberikan gambaran umum tentang metode dan praktik enkripsi yang didukung oleh .NET, termasuk manifes ClickOnce.

Pengantar kriptografi

Jaringan umum seperti Internet tidak menyediakan sarana komunikasi yang aman antar-entitas. Komunikasi melalui jaringan tersebut rentan untuk 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 sarana komunikasi yang aman melalui saluran yang tidak aman. Misalnya, data dapat dienkripsi dengan menggunakan algoritma kriptografi, dikirimkan dalam status terenkripsi, kemudian didekripsi oleh pihak yang dimaksud. Jika pihak ketiga mencegat data terenkripsi, akan sulit untuk menguraikannya.

Di .NET, kelas di namespace layanan System.Security.Cryptography 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 seaman dan seaman mungkin.

Primitif Kriptografi

Dalam situasi umum yang menggunakan 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 dia terima dari Bob belum dimodifikasi oleh siapa pun selama transmisi. Selain itu, dia harus memastikan bahwa informasi tersebut 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.

  • Non-penolakan: Untuk mencegah pihak tertentu membantah 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 Menggunakan
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 umum (kriptografi asimetris) Melakukan transformasi pada data agar tidak dibaca oleh pihak ketiga. Jenis enkripsi ini menggunakan satu kunci rahasia bersama 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 Peta data dari panjang apa pun hingga urutan byte panjang tetap. Hash unik secara statistik; urutan dua byte yang berbeda tidak akan hash ke nilai yang sama.

Enkripsi Kunci Rahasia

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 umum) 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. Cipher blok 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 sederhana cipher blok disebut mode electronic codebook (ECB). Mode ECB tidak dianggap aman, karena tidak menggunakan vektor inisialisasi untuk menginisialisasi blok teks biasa pertama. Untuk kunci rahasia k tertentu, 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 di aliran teks biasa input, Anda akan memiliki blok duplikat di aliran ciphertext output Anda. Blok output duplikat ini memperingatkan pengguna yang tidak sah terhadap enkripsi yang lemah menggunakan algoritma yang mungkin telah 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 penautan default yang disebut cipher-block chaining (CBC), meski 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 plaintext. Setiap blok teks biasa berikutnya menjalani operasi OR (XOR) eksklusif bitwise dengan blok ciphertext sebelumnya sebelum dienkripsi. Oleh karena itu, setiap blok ciphertext bergantung pada semua blok sebelumnya. Saat 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 ukuran kunci yang digunakan untuk melakukan enkripsi, pencarian semacam ini sangat memakan waktu menggunakan bahkan komputer tercepat dan karenanya tidak layak. Ukuran kunci yang lebih besar lebih sulit untuk diurai. Meski enkripsi tidak membuatnya secara teoritis tidak mungkin bagi adversary untuk mengambil data terenkripsi, itu memang meningkatkan biaya untuk melakukan ini. Jika dibutuhkan tiga bulan untuk melakukan pencarian lengkap untuk mengambil data yang bermakna hanya selama beberapa hari, metode pencarian lengkap tidak mungkin dilakukan.

Kerugian dari enkripsi kunci rahasia adalah bahwa ini berasumsi bahwa dua pihak telah menyepakati kunci dan IV, dan mengomunikasikan nilai-nilai mereka. IV tidak dianggap sebagai rahasia dan dapat ditransmisikan dalam teks biasa dengan pesan. Namun, kunci harus dirahasiakan dari pengguna yang tidak sah. Karena masalah ini, enkripsi kunci rahasia sering digunakan bersama dengan enkripsi kunci umum untuk mengomunikasikan 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 yang dinamai 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 sebelumnya disepakati pada kunci. 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, baik Alice atau Bob menghasilkan kunci rahasia dan menggunakan enkripsi kunci umum (asimetris) untuk mentransfer kunci rahasia (simetris) ke pihak lain. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat tabel di bagian berikutnya.

.NET menyediakan kelas berikut yang mengimplementasikan algoritma enkripsi kunci rahasia:

  • Aes

  • HMACSHA256, HMACSHA384, dan HMACSHA512. (Ini secara teknis algoritma kunci rahasia 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 Kunci Publik

Enkripsi kunci umum menggunakan kunci privat yang harus dirahasiakan dari pengguna yang tidak sah dan kunci umum yang dapat dibuat tersedia untuk umum bagi kepada siapa saja. Kunci umum dan kunci privat ditautkan secara matematis; data yang dienkripsi dengan kunci umum hanya dapat didekripsi dengan kunci privat, dan data yang ditandai dengan kunci privat hanya dapat diverifikasi dengan kunci umum. Kunci umum dapat disediakan untuk siapa saja; ini digunakan untuk mengenkripsi data yang akan dikirim ke penjaga kunci privat. Algoritma kriptografi kunci umum 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 umum sebagai berikut: Pertama, Alice menghasilkan pasangan kunci umum/privat. Jika Bob ingin mengirimi Alice pesan terenkripsi, dia menanyakan kunci umumnya kepada Alice. Alice mengirim Bob kunci umumnya 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 privatnya. Jika Bob menerima kunci Alice melalui saluran yang tidak aman, seperti jaringan umum, Bob terbuka untuk serangan man-in-the-middle. Oleh karena itu, Bob harus memverifikasi dengan Alice bahwa dia memiliki salinan yang benar dari kunci umumnya.

Selama transmisi kunci umum 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 umum. 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 umum 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 umum (asimetris) untuk mentransfer kunci rahasia (simetris) dan menggunakan enkripsi kunci rahasia untuk sisa sesi mereka.

Daftar berikut menawarkan perbandingan antara algoritma kriptografi kunci umum dan kunci rahasia:

  • Algoritma kriptografi kunci umum menggunakan ukuran buffer tetap, sedangkan algoritma kriptografi kunci rahasia menggunakan buffer panjang variabel.

  • Algoritma kunci umum tidak dapat digunakan untuk menautkan data bersama 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 umum memiliki ruang kunci yang jauh lebih besar (rentang nilai yang mungkin untuk kunci) daripada enkripsi kunci rahasia. Oleh karena itu, enkripsi kunci umum kurang rentan terhadap serangan lengkap yang mencoba setiap kunci yang mungkin.

  • Kunci umum mudah didistribusikan karena tidak harus diamankan, asalkan ada beberapa cara untuk memverifikasi identitas pengirim.

  • Beberapa algoritma kunci umum (seperti RSA dan DSA, tetapi bukan Diffie-Hellman) dapat digunakan untuk membuat tanda tangan digital untuk memverifikasi identitas pengirim data.

  • Algoritma kunci umum sangat lambat dibandingkan dengan algoritma kunci rahasia, dan tidak dirancang untuk mengenkripsi data dalam jumlah besar. Algoritma kunci umum hanya berguna untuk mentransfer data dalam jumlah yang sangat kecil. Biasanya, enkripsi kunci umum 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 umum:

RSA memungkinkan enkripsi dan penandaan, tetapi DSA hanya dapat digunakan untuk penandaan. DSA tidak seaman RSA, dan kami merekomendasikan RSA. Diffie-Hellman hanya dapat digunakan untuk pembuatan kunci. Secara umum, algoritma kunci umum lebih terbatas dalam penggunaannya daripada algoritma kunci privat.

Tanda Tangan Digital

Algoritma kunci umum 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 umum yang dihasilkan oleh Alice, penerima data Alice dapat memverifikasi bahwa Alice mengirimkannya dengan membandingkan tanda tangan digital dengan data Alice dan kunci umum Alice.

Untuk menggunakan kriptografi kunci umum untuk menandatangani pesan secara digital, Alice terlebih dahulu menerapkan algoritme hash ke pesan untuk membuat hash pesan. Hash adalah representasi data yang ringkas dan unik. Alice kemudian mengenkripsi hash dengan kunci privatnya untuk membuat tanda tangan pribadinya. Setelah menerima pesan dan tanda tangan, Bob mendekripsi tanda tangan menggunakan kunci umum Alice untuk memulihkan hash dan melakukan hash pesan menggunakan algoritme hash yang sama dengan yang digunakan Alice. Jika hash yang dikomputasi oleh Bob sama persis dengan hash yang diterima dari Alice, Bob yakin bahwa pesan 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.

Catatan

Tanda tangan dapat diverifikasi oleh siapa saja karena kunci umum pengirim adalah pengetahuan umum dan biasanya disertakan dalam format tanda tangan digital. Metode ini tidak mempertahankan kerahasiaan 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 hash ke nilai output yang sama. Namun, secara komputasi tidak layak untuk menemukan dua input berbeda yang hash dengan nilai yang sama.

Dua pihak (Alice dan Bob) dapat menggunakan fungsi hash untuk memastikan integritas pesan. Mereka akan memilih algoritme 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 dan melakukan hash pesan dan membandingkan nilai hash-nya 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 autensitas pengirim. Siapa pun dapat meniru Alice dan mengirim pesan ke Bob. Mereka dapat menggunakan algoritme hash yang sama untuk menandatangani pesan mereka, dan semua Bob dapat menentukan 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 umum yang tidak aman. Alice mengirim pesan teks biasa ke Bob melalui saluran privat yang tidak aman. Bob menerima pesan teks biasa, hash, dan membandingkan hash dengan hash yang dipertukarkan secara privat. Jika hash cocok, Bob tahu dua hal:

    • Pesan tidak diubah.

    • Pengirim pesan (Alice) autentik.

    Agar sistem ini berfungsi, Alice harus menyembunyikan nilai hash aslinya dari semua pihak kecuali Bob.

  • Alice mengirim pesan teks biasa ke Bob melalui saluran umum yang tidak aman dan menempatkan pesan hash di Situs webnya yang dapat dilihat umum.

    Metode ini mencegah pengubahan pesan dengan mencegah siapa pun mengubah nilai hash. Meski pesan dan hashnya dapat dibaca oleh siapa saja, 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 (penandaan pesan) dan enkripsi.

.NET menyediakan kelas berikut yang menerapkan algoritme 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 tidak terpisahkan dari banyak operasi kriptografi. Misalnya, kunci kriptografi harus seacak 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 adalah implementasi dari algoritma generator angka acak.

Manifes ClickOnce

Kelas kriptografi berikut memungkinkan Anda mendapatkan dan memverifikasi informasi tentang tanda tangan manifes untuk aplikasi yang disebarkan menggunakan teknologi ClickOnce:

Selain itu, kelas berikut memberikan informasi tanda tangan tertentu:

Kelas Kriptografi Generasi Berikutnya (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. Pusat kelas pembungkus CNG adalah CngKey kelas kontainer utama, yang mengabstraksi penyimpanan dan penggunaan kunci CNG. Kelas ini memungkinkan Anda menyimpan pasangan kunci atau kunci umum dengan aman dan mereferensikannya dengan menggunakan nama string sederhana. Kelas tanda tangan berbasis ECDsaCng kurva elips dan ECDiffieHellmanCng kelas enkripsi dapat menggunakan objek CngKey.

Kelas CngKey ini digunakan untuk berbagai operasi tambahan, termasuk membuka, membuat, menghapus, dan mengekspor kunci. Ini juga menyediakan akses ke handel kunci yang mendasar untuk digunakan saat memanggil fungsi asli secara langsung.

.NET juga mencakup berbagai kelas CNG pendukung, seperti berikut:

Lihat juga