Jangan ragu untuk mengoreksi saya jika asumsi saya salah di sini, tetapi izinkan saya menjelaskan mengapa saya bertanya.
Diambil dari MSDN, a SecureString
:
Merupakan teks yang harus dijaga kerahasiaannya. Teks dienkripsi untuk privasi saat digunakan, dan dihapus dari memori komputer ketika tidak lagi diperlukan.
Saya mendapatkan ini, sangat masuk akal untuk menyimpan kata sandi atau informasi pribadi lainnya di SecureString
atas System.String
, karena Anda dapat mengontrol bagaimana dan kapan itu sebenarnya disimpan dalam memori, karena a System.String
:
keduanya kekal dan, ketika tidak lagi diperlukan, tidak dapat dijadwalkan secara program untuk pengumpulan sampah; Yaitu, instance hanya-baca setelah dibuat dan tidak mungkin untuk memprediksi kapan instance akan dihapus dari memori komputer. Akibatnya, jika objek String berisi informasi sensitif seperti kata sandi, nomor kartu kredit, atau data pribadi, ada risiko informasi tersebut dapat diungkapkan setelah digunakan karena aplikasi Anda tidak dapat menghapus data dari memori komputer.
Namun, dalam kasus aplikasi GUI (misalnya, klien ssh), SecureString
harus dibangun dari a System.String
. Semua kontrol teks menggunakan string sebagai tipe data yang mendasarinya .
Jadi, ini berarti bahwa setiap kali pengguna menekan kunci, string lama yang ada di sana dibuang, dan string baru dibangun untuk mewakili nilai di dalam kotak teks, bahkan jika menggunakan topeng kata sandi. Dan kita tidak dapat mengontrol kapan atau jika salah satu dari nilai-nilai itu dibuang dari memori .
Sekarang saatnya untuk masuk ke server. Tebak apa? Anda perlu memberikan string pada koneksi untuk otentikasi . Jadi mari kita konversikan SecureString
menjadi System.String
.... dan sekarang kita memiliki string di heap tanpa ada cara untuk memaksanya melalui pengumpulan sampah (atau menulis 0 ke buffernya).
Maksud saya adalah : tidak peduli apa yang Anda lakukan, suatu tempat di sepanjang garis, yang SecureString
sedang akan akan diubah menjadi System.String
, berarti setidaknya akan eksis di tumpukan di beberapa titik (tanpa jaminan pengumpulan sampah).
Maksud saya bukanlah : apakah ada cara mengelak mengirim string ke koneksi ssh, atau menghindari memiliki kontrol menyimpan string (membuat kontrol kustom). Untuk pertanyaan ini, Anda dapat mengganti "koneksi ssh" dengan "formulir masuk", "formulir pendaftaran", "formulir pembayaran", "makanan-Anda-akan-memberi makan formulir anak anjing-tetapi-bukan-anak-Anda", dll.
- Jadi, pada titik apa menggunakan
SecureString
sebenarnya menjadi praktis? - Apakah ini sepadan dengan waktu pengembangan ekstra untuk sepenuhnya menghapus penggunaan
System.String
objek? - Apakah seluruh titik
SecureString
untuk hanya mengurangi jumlah waktu yangSystem.String
ada di tumpukan (mengurangi risiko pindah ke file swap fisik)? - Jika penyerang sudah memiliki sarana untuk inspeksi tumpukan, maka kemungkinan besar dia (A) sudah memiliki sarana untuk membaca penekanan tombol, atau (B) secara fisik memiliki mesin ... Jadi akan menggunakan
SecureString
mencegah dia dari mendapatkan ke data lagian? - Apakah ini hanya "keamanan melalui ketidakjelasan"?
Maaf jika saya mengajukan pertanyaan terlalu tebal, rasa ingin tahu hanya membuat saya lebih baik. Merasa bebas untuk menjawab salah satu atau semua pertanyaan saya (atau memberi tahu saya bahwa asumsi saya sepenuhnya salah). :)
SecureString
itu bukan string yang aman. Ini hanyalah cara untuk mengurangi jendela waktu di mana seseorang dapat memeriksa memori Anda dan berhasil mendapatkan data sensitif. Ini bukan antipeluru dan tidak dimaksudkan untuk itu. Tetapi poin yang Anda naikkan sangat valid. Terkait: stackoverflow.com/questions/14449579/…