Bagaimana cara mengonversi String
ke SecureString
?
Bagaimana cara mengonversi String
ke SecureString
?
Jawaban:
Kamu tidak. Seluruh alasan menggunakan objek SecureString adalah untuk menghindari pembuatan objek string (yang dimuat ke memori dan disimpan di sana dalam teks biasa hingga pengumpulan sampah). Namun, Anda dapat menambahkan karakter ke SecureString dengan menambahkannya.
var s = new SecureString();
s.AppendChar('d');
s.AppendChar('u');
s.AppendChar('m');
s.AppendChar('b');
s.AppendChar('p');
s.AppendChar('a');
s.AppendChar('s');
s.AppendChar('s');
s.AppendChar('w');
s.AppendChar('d');
*****
AppendChar
tidak dieksekusi hingga run time, jadi karakter tersebut masih dapat dibaca dari IL, bukan? Mungkin beberapa kebingungan waktu kompilasi akan membantu juga ... yaitu, jika Anda membuat sandi dengan keras.
Ada juga cara lain untuk mengonversi antara SecureString
dan String
.
1. String ke SecureString
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2. SecureString ke String
string theString = new NetworkCredential("", theSecureString).Password;
Ini tautannya
SecureString
jika kode Anda membuat string
objek dengan nilai yang ingin Anda amankan. Tujuannya SecureString
adalah menghindari string dalam memori yang dikelola, sehingga penyerang yang memeriksa memori tersebut dapat menemukan nilai yang ingin Anda sembunyikan. Karena NetworkCredential
konstruktor yang Anda panggil memerlukan string, itu bukan cara untuk pergi ... Tentu, kode Anda adalah cara mudah untuk mengkonversi ke dan dari SecureString, tetapi menggunakannya membuat kode Anda seaman menggunakan yang sederhanastring
SecureString
saat bekerja dengan beberapa perpustakaan. Dan jujur saja di sini, jika seseorang secara aktif memindai memori aplikasi Anda, maka Anda sudah hilang. Bahkan jika Anda telah menggunakan SecureString dengan benar, yang belum pernah saya lihat, akan ada data berharga lainnya untuk diekstrak.
metode di bawah ini membantu untuk mengubah string menjadi string aman
private SecureString ConvertToSecureString(string password)
{
if (password == null)
throw new ArgumentNullException("password");
var securePassword = new SecureString();
foreach (char c in password)
securePassword.AppendChar(c);
securePassword.MakeReadOnly();
return securePassword;
}
Berikut ini trik linq murah.
SecureString sec = new SecureString();
string pwd = "abc123"; /* Not Secure! */
pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
/* and now : seal the deal */
sec.MakeReadOnly();
Aku akan membuang ini ke sana. Mengapa?
Anda tidak bisa begitu saja mengubah semua string Anda menjadi string aman dan tiba-tiba aplikasi Anda "aman". String aman dirancang untuk menjaga agar string tetap dienkripsi selama mungkin, dan hanya didekripsi untuk waktu yang sangat singkat, menghapus memori setelah operasi dilakukan padanya.
Saya berani mengatakan bahwa Anda mungkin memiliki beberapa masalah tingkat desain untuk ditangani sebelum khawatir tentang mengamankan string aplikasi Anda. Beri kami beberapa informasi lebih lanjut tentang apa yang Anda coba lakukan dan kami mungkin dapat membantu dengan lebih baik.
tidak ada linq mewah, tidak menambahkan semua karakter dengan tangan, hanya polos dan sederhana:
var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);
var sc = new SecureString(); foreach(char c in "foo") sc.appendChar(c);
Saya hanya ingin menunjukkan kepada semua orang yang berkata, "Bukan itu intinya SecureString
", bahwa banyak orang yang menanyakan pertanyaan ini mungkin dalam aplikasi di mana, untuk alasan apa pun, dibenarkan atau tidak, mereka tidak terlalu peduli tentang memiliki salinan sementara kata sandi berada di heap sebagai string yang dapat digunakan GC, tetapi mereka harus menggunakan API yang hanya menerimaSecureString
objek. Jadi, Anda memiliki aplikasi yang tidak Anda pedulikanapakah kata sandi ada di heap, mungkin itu hanya penggunaan internal dan kata sandi hanya ada di sana karena diperlukan oleh protokol jaringan yang mendasarinya, dan Anda menemukan bahwa string tempat kata sandi disimpan tidak dapat digunakan misalnya untuk mengatur PowerShell jarak jauh Runspace - tetapi tidak ada satu baris yang mudah dan lurus ke depan untuk membuat SecureString
yang Anda butuhkan. Ini adalah ketidaknyamanan kecil - tetapi mungkin sepadan untuk memastikan bahwa aplikasi yang benar - benar membutuhkan SecureString
tidak menggoda penulis untuk menggunakan System.String
atau System.Char[]
perantara. :-)
Jika Anda ingin memampatkan konversi dari a string
ke a SecureString
menjadi LINQ
pernyataan, Anda dapat mengekspresikannya sebagai berikut:
var plain = "The quick brown fox jumps over the lazy dog";
var secure = plain
.ToCharArray()
.Aggregate( new SecureString()
, (s, c) => { s.AppendChar(c); return s; }
, (s) => { s.MakeReadOnly(); return s; }
);
Namun, perlu diingat bahwa menggunakan LINQ
tidak meningkatkan keamanan solusi ini. Itu menderita cacat yang sama seperti setiap konversi dari string
menjadi SecureString
. Selama dokumen asli string
tetap ada di memori, data rentan.
Yang sedang berkata, apa yang dapat ditawarkan pernyataan di atas adalah menjaga bersama pembuatan SecureString
, inisialisasi dengan data dan akhirnya menguncinya dari modifikasi.
2 ekstensi berikut harus melakukan triknya:
Untuk sebuah char
array
public static SecureString ToSecureString(this char[] _self)
{
SecureString knox = new SecureString();
foreach (char c in _self)
{
knox.AppendChar(c);
}
return knox;
}
Dan untuk string
public static SecureString ToSecureString(this string _self)
{
SecureString knox = new SecureString();
char[] chars = _self.ToCharArray();
foreach (char c in chars)
{
knox.AppendChar(c);
}
return knox;
}
Terima kasih kepada John Dagg atas AppendChar
rekomendasinya.
Anda dapat menggunakan skrip sederhana ini
private SecureString SecureStringConverter(string pass)
{
SecureString ret = new SecureString();
foreach (char chr in pass.ToCharArray())
ret.AppendChar(chr);
return ret;
}
12345
... itu jenis barang yang dimiliki orang idiot di kopernya!"