Bagikan melalui


Kelas System.Security.SecureString

Penting

Kami menyarankan agar Anda tidak menggunakan SecureString kelas untuk pengembangan baru di .NET (Core) atau saat Anda memigrasikan kode yang ada ke .NET (Core). Untuk informasi selengkapnya, lihat SecureString tidak boleh digunakan.

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

SecureString adalah jenis string yang menyediakan ukuran keamanan. Ini mencoba untuk menghindari penyimpanan string yang berpotensi sensitif dalam memori proses sebagai teks biasa. (Namun, untuk batasan, lihat Seberapa aman SecureString? bagian.) Nilai instans SecureString secara otomatis dilindungi menggunakan mekanisme yang didukung oleh platform yang mendasar ketika instans diinisialisasi atau ketika nilai dimodifikasi. Aplikasi Anda dapat merender instans yang tidak dapat diubah dan mencegah modifikasi lebih lanjut dengan memanggil MakeReadOnly metode .

Panjang SecureString maksimum instans adalah 65.536 karakter.

Penting

Jenis ini mengimplementasikan IDisposable antarmuka. Setelah selesai menggunakan instans jenis, Anda harus membuangnya baik secara langsung maupun tidak langsung. Untuk membuang jenis secara langsung, panggil metodenya Dispose dalam try/catch blok. Untuk membuangnya secara tidak langsung, gunakan konstruksi bahasa seperti using (di C#) atau Using (di Visual Basic). Untuk informasi selengkapnya, lihat bagian "Menggunakan Objek yang Menerapkan IDisposable" dalam IDisposable topik antarmuka.

Kelas SecureString dan anggotanya tidak terlihat oleh COM. Untuk informasi selengkapnya, lihat ComVisibleAttribute .

String versus SecureString

Instans System.String kelas tidak dapat diubah dan, ketika tidak lagi diperlukan, tidak dapat dijadwalkan secara terprogram untuk pengumpulan sampah; yaitu, instans bersifat baca-saja setelah dibuat, dan tidak mungkin untuk memprediksi kapan instans akan dihapus dari memori komputer. Karena System.String instans tidak dapat diubah, operasi yang tampaknya memodifikasi instans yang ada benar-benar membuat salinannya untuk dimanipulasi. Akibatnya, jika String objek berisi informasi sensitif seperti kata sandi, nomor kartu kredit, atau data pribadi, ada risiko informasi dapat terungkap setelah digunakan karena aplikasi Anda tidak dapat menghapus data dari memori komputer.

Objek SecureString mirip String dengan objek yang memiliki nilai teks. Namun, nilai SecureString objek disematkan dalam memori, dapat menggunakan mekanisme perlindungan, seperti enkripsi, yang disediakan oleh sistem operasi yang mendasar, dapat dimodifikasi sampai aplikasi Anda menandainya sebagai baca-saja, dan dapat dihapus dari memori komputer baik oleh aplikasi Anda yang memanggil Dispose metode atau oleh pengumpul sampah .NET.

Untuk diskusi tentang batasan SecureString kelas, lihat bagian Seberapa aman SecureString? .

Operasi SecureString

Kelas ini SecureString mencakup anggota yang memungkinkan Anda melakukan hal berikut:

Membuat instans SecureString objek Anda membuat SecureString instans objek dengan memanggil konstruktor tanpa parameternya.

Tambahkan karakter ke SecureString objek Anda dapat menambahkan satu karakter pada satu waktu ke SecureString objek dengan memanggil atau metodenya AppendCharInsertAt .

Penting

Objek SecureString tidak boleh dibangun dari String, karena data sensitif sudah tunduk pada konsekuensi persistensi memori dari kelas yang tidak dapat String diubah. Cara terbaik untuk membuat SecureString objek adalah dari sumber tidak terkelola karakter pada waktu tertentu, seperti Console.ReadKey metode .

Hapus karakter dari SecureString objek Anda dapat mengganti karakter individual dengan memanggil SetAt metode , menghapus karakter individual dengan memanggil RemoveAt metode , atau menghapus semua karakter dari SecureString instans dengan memanggil Clear metode .

SecureString Buat objek baca-saja Setelah Anda menentukan string yang diwakili SecureString objek, Anda memanggil metodenya MakeReadOnly untuk membuat string baca-saja.

Dapatkan informasi tentang SecureString objek Kelas SecureString hanya memiliki dua anggota yang memberikan informasi tentang string: propertinya Length , yang menunjukkan jumlah unit kode yang dikodekan UTF16 dalam string; dan IsReadOnlymetode , yang menunjukkan apakah instans bersifat baca-saja.

Lepaskan memori yang dialokasikan ke SecureString instans Karena SecureString mengimplementasikan antarmuka, Anda merilis IDisposable memorinya dengan memanggil Dispose metode .

Kelas SecureString tidak memiliki anggota yang memeriksa, membandingkan, atau mengonversi nilai SecureString. Tidak adanya anggota tersebut membantu melindungi nilai instans dari paparan yang tidak disengaja atau berbahaya. Gunakan anggota kelas yang System.Runtime.InteropServices.Marshal sesuai, seperti SecureStringToBSTR metode , untuk memanipulasi nilai SecureString objek.

Pustaka Kelas .NET biasanya menggunakan instans SecureString dengan cara berikut:

SecureString dan interop

Karena sistem operasi tidak secara langsung mendukung SecureString, Anda harus mengonversi nilai SecureString objek ke jenis string yang diperlukan sebelum meneruskan string ke metode asli. Kelas Marshal ini memiliki lima metode yang melakukan ini:

Masing-masing metode ini membuat string teks yang jelas dalam memori yang tidak dikelola. Ini adalah tanggung jawab pengembang untuk nol keluar dan membebaskan memori itu segera setelah tidak lagi diperlukan. Masing-masing metode konversi string dan alokasi memori memiliki metode yang sesuai untuk nol keluar dan membebaskan memori yang dialokasikan:

Metode alokasi dan konversi Nol dan metode gratis
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

Seberapa aman SecureString?

Saat dibuat dengan benar, instans memberikan lebih banyak SecureString perlindungan data daripada String. Saat membuat string dari sumber karakter-pada-a-time, String membuat beberapa perantara dalam memori, sedangkan SecureString hanya membuat satu instans. Pengumpulan String sampah objek tidak deterministik. Selain itu, karena memorinya tidak disematkan, pengumpul sampah akan membuat salinan String nilai tambahan saat memindahkan dan memampatkan memori. Sebaliknya, memori yang SecureString dialokasikan untuk objek disematkan, dan memori tersebut dapat dibebaskan dengan memanggil Dispose metode .

Meskipun data yang SecureString disimpan dalam instans lebih aman daripada data yang String disimpan dalam instans, ada batasan signifikan tentang seberapa aman SecureString instans. Ini termasuk:

Platform

Pada sistem operasi Windows, konten array karakter internal instans SecureString dienkripsi. Namun, apakah karena API yang hilang atau masalah manajemen kunci, enkripsi tidak tersedia di semua platform. Karena dependensi platform ini, SecureString tidak mengenkripsi penyimpanan internal pada platform non-Windows. Teknik lain digunakan pada platform tersebut untuk memberikan perlindungan tambahan.

Durasi

Bahkan jika SecureString implementasi dapat memanfaatkan enkripsi, teks biasa yang ditetapkan ke SecureString instans dapat diekspos pada berbagai waktu:

  • Karena Windows tidak menawarkan implementasi string aman di tingkat sistem operasi, .NET masih harus mengonversi nilai string aman ke representasi teks biasanya untuk menggunakannya.

  • Setiap kali nilai string aman dimodifikasi oleh metode seperti AppendChar atau RemoveAt, itu harus didekripsi (yaitu, dikonversi kembali ke teks biasa), dimodifikasi, dan kemudian dienkripsi lagi.

  • Jika string aman digunakan dalam panggilan interop, string harus dikonversi ke string ANSI, string Unicode, atau string biner (BSTR). Untuk informasi selengkapnya, lihat bagian SecureString dan interop .

Interval waktu di mana SecureString nilai instans diekspos hanya dipersingkat dibandingkan dengan String kelas.

Penyimpanan versus penggunaan Lebih umum, SecureString kelas menentukan mekanisme penyimpanan untuk nilai string yang harus dilindungi atau dirahasiakan. Namun, di luar .NET itu sendiri, tidak ada mekanisme penggunaan yang SecureStringmendukung . Ini berarti bahwa string aman harus dikonversi ke bentuk yang dapat digunakan (biasanya bentuk teks yang jelas) yang dapat dikenali oleh targetnya, dan dekripsi dan konversi harus terjadi di ruang pengguna.

Secara keseluruhan, SecureString lebih aman daripada String karena membatasi paparan data string sensitif. Namun, string tersebut mungkin masih terekspos ke proses atau operasi apa pun yang memiliki akses ke memori mentah, seperti proses berbahaya yang berjalan di komputer host, cadangan proses, atau file pertukaran yang dapat dilihat pengguna. Alih-alih menggunakan SecureString untuk melindungi kata sandi, alternatif yang direkomendasikan adalah menggunakan handel buram ke kredensial yang disimpan di luar proses.