SecureString Kelas

Definisi

Mewakili teks yang harus dirahasiakan, seperti dengan menghapusnya dari memori komputer saat tidak lagi diperlukan. Kelas ini tidak dapat diwariskan.

public ref class SecureString sealed : IDisposable
public sealed class SecureString : IDisposable
type SecureString = class
    interface IDisposable
Public NotInheritable Class SecureString
Implements IDisposable
Warisan
SecureString
Penerapan

Contoh

Contoh berikut menunjukkan cara menggunakan SecureString untuk mengamankan kata sandi pengguna untuk digunakan sebagai kredensial untuk memulai proses baru.

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Security;

public class Example
{
    public static void Main()
    {
        // Instantiate the secure string.
        SecureString securePwd = new SecureString();
        ConsoleKeyInfo key;

        Console.Write("Enter password: ");
        do {
           key = Console.ReadKey(true);
           
           // Ignore any key out of range.
           if (((int) key.Key) >= 65 && ((int) key.Key <= 90)) {
              // Append the character to the password.
              securePwd.AppendChar(key.KeyChar);
              Console.Write("*");
           }   
        // Exit if Enter key is pressed.
        } while (key.Key != ConsoleKey.Enter);
        Console.WriteLine();
        
        try {
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN");
        }
        catch (Win32Exception e) {
            Console.WriteLine(e.Message);
        }
        finally {
           securePwd.Dispose();
        }
    }
}
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Security

Public Class Example
    Public Shared Sub Main()
        ' Instantiate the secure string.
        Dim securePwd As New SecureString()
        Dim key As ConsoleKeyInfo
        
        Console.Write("Enter password: ")
        Do
           key = Console.ReadKey(True)

           ' Ignore any key out of range
           If CInt(key.Key) >= 65 And CInt(key.Key <= 90) Then    
              ' Append the character to the password.
              securePwd.AppendChar(key.KeyChar)
              Console.Write("*")
           End If                                    
        ' Exit if Enter key is pressed.
        Loop While key.Key <> ConsoleKey.Enter
        Console.WriteLine()
        
        Try
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN")
        Catch e As Win32Exception
            Console.WriteLine(e.Message)
        Finally
           securePwd.Dispose()
        End Try
    End Sub
End Class

Keterangan

Important

Kami menyarankan agar Anda tidak menggunakan SecureString kelas untuk pengembangan baru pada .NET (Core) atau saat Anda bermigrasi dari .NET Framework. Untuk informasi selengkapnya, lihat SecureString tidak boleh digunakan.

Note

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 bagian Seberapa aman SecureString? ) 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.

Important

Jenis ini mengimplementasikan antarmuka IDisposable. Setelah selesai menggunakan instance dari jenis, Anda harus menghapusnya baik secara langsung maupun tidak langsung. Untuk meniadakan tipe secara langsung, panggil metode Dispose dalam blok try/catch. Untuk membuangnya secara tidak langsung, gunakan konstruksi bahasa seperti using (dalam 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 instans System.String bersifat tidak dapat diubah, operasi yang terlihat memodifikasi instans yang ada sebenarnya membuat salinan darinya 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 dengan objek String karena memiliki nilai teks. Namun, nilai SecureString objek:

  • Disematkan dalam memori.
  • Mungkin menggunakan mekanisme perlindungan, seperti enkripsi, yang disediakan oleh sistem operasi yang mendasar.
  • Dapat dimodifikasi hingga aplikasi Anda menandainya sebagai baca-saja.
  • Dapat dihapus dari memori komputer baik oleh aplikasi Anda yang Dispose memanggil 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:

Menginstansiasi suatu objek SecureString Anda menginstansiasi objek SecureString dengan memanggil konstruktor tanpa parameter.

Tambahkan karakter ke objek SecureString Anda dapat menambahkan satu karakter satu per satu ke objek SecureString dengan memanggil metode AppendChar atau InsertAt.

Important

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 objek SecureString adalah dari sumber tanpa pengelolaan karakter-per-karakter, seperti metode Console.ReadKey.

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 .

Jadikan objek SecureString bersifat hanya-baca Setelah Anda menentukan string yang diwakili oleh objek SecureString, panggil metode MakeReadOnly untuk menjadikan string tersebut bersifat hanya-baca.

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 instans SecureString. Karena SecureString mengimplementasikan antarmuka IDisposable, Anda merilis memorinya dengan memanggil metode Dispose.

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

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. Tanggung jawab pengembang adalah untuk menghapus dan membebaskan memori tersebut segera setelah tidak lagi diperlukan. Masing-masing metode konversi string dan alokasi memori memiliki metode yang sesuai untuk mengeset nilai menjadi nol dan membebaskan memori yang telah dialokasikan.

Metode alokasi dan konversi Metode Nol dan 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 SecureString memberikan perlindungan data yang lebih banyak daripada String. Saat membuat string dari sumber karakter satu per satu, String membuat beberapa objek sementara dalam memori, sedangkan SecureString hanya membuat satu instansi. Pengumpulan String sampah objek tidak deterministik. Selain itu, karena memorinya tidak disematkan, pengumpul sampah akan membuat salinan tambahan dari nilai-nilai String saat memindahkan dan memampatkan memori. Sebaliknya, memori yang dialokasikan untuk objek SecureString dipin, dan memori tersebut dapat dibebaskan dengan memanggil metode Dispose.

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

  • Platform

    Pada sistem operasi Windows, konten dari array karakter internal sebuah 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 .

    Nilai instans SecureString diekspos dalam interval waktu yang lebih singkat, dibandingkan dengan kelas String.

  • Penyimpanan versus penggunaan

    Secara 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 mendukung SecureString. 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.

Konstruktor

Nama Deskripsi
SecureString()

Menginisialisasi instans baru dari kelas SecureString.

SecureString(Char*, Int32)

Menginisialisasi instans SecureString baru kelas dari subarray Char objek.

Konstruktor ini tidak sesuai dengan CLS. Alternatif yang mematuhi CLS adalah SecureString().

Properti

Nama Deskripsi
Length

Mendapatkan jumlah karakter dalam string aman saat ini.

Metode

Nama Deskripsi
AppendChar(Char)

Menambahkan karakter ke akhir string aman saat ini.

Clear()

Menghapus nilai string aman saat ini.

Copy()

Membuat salinan string aman saat ini.

Dispose()

Merilis semua sumber daya yang digunakan oleh objek saat ini SecureString .

Equals(Object)

Menentukan apakah objek yang ditentukan sama dengan objek saat ini.

(Diperoleh dari Object)
GetHashCode()

Berfungsi sebagai fungsi hash default.

(Diperoleh dari Object)
GetType()

Mendapatkan Type instans saat ini.

(Diperoleh dari Object)
InsertAt(Int32, Char)

Menyisipkan karakter dalam string aman ini pada posisi indeks yang ditentukan.

IsReadOnly()

Menunjukkan apakah string aman ini ditandai baca-saja.

MakeReadOnly()

Membuat nilai teks dari string aman ini baca-saja.

MemberwiseClone()

Membuat salinan dangkal dari Objectsaat ini.

(Diperoleh dari Object)
RemoveAt(Int32)

Menghapus karakter pada posisi indeks yang ditentukan dari string aman ini.

SetAt(Int32, Char)

Mengganti karakter yang ada pada posisi indeks yang ditentukan dengan karakter lain.

ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)

Berlaku untuk

Lihat juga