Nasıl dönüştürmek String
için SecureString
?
Nasıl dönüştürmek String
için SecureString
?
Yanıtlar:
Yapmıyorsun. SecureString nesnesini kullanmanın tüm nedeni, bir dizgi nesnesi oluşturmaktan kaçınmaktır (bu, belleğe yüklenir ve çöp toplamaya kadar orada düz metin olarak tutulur). Ancak, SecureString'e karakterleri ekleyerek ekleyebilirsiniz.
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
çalışma zamanına kadar çalışmaz, bu nedenle bu karakterler hala IL'den okunabilir, değil mi? Belki derleme zamanı gizlemesi de yardımcı olabilir ... yani, şifreleri sabit kodluyorsanız.
SecureString
Ve arasında dönüştürme yapmanın başka bir yolu daha var String
.
1. SecureString'e Dize
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2. SecureString'den Dizeye
string theString = new NetworkCredential("", theSecureString).Password;
İşte bağlantı
SecureString
Kodunuz string
, güvence altına almak istediğiniz değere sahip bir nesne oluşturuyorsa, a kullanmanın bir anlamı yoktur . Amacı SecureString
, dizenin yönetilen bellekte yer almasından kaçınmaktır, böylece bu belleği inceleyen bir saldırgan, gizlemek istediğiniz değeri tespit edebilir. Yana NetworkCredential
Aradığınız yapıcı ... Emin gitmek yol değil bir dize gerektirir, kodunuz ve bir SecureString dan dönüştürmek için kolay bir yoldur, ama bunu kullanarak bir basit kullanma gibi güvenli kodunuzu yaparstring
SecureString
bazı kütüphanelerle çalışırken hala kullanmamız gerekiyor . Ve burada dürüst olalım, eğer birisi uygulamanızın belleğini aktif olarak tarıyorsa, o zaman zaten kaybettiniz demektir. SecureString'i daha önce hiç görmediğim şekilde doğru kullanmış olsanız bile, çıkarılacak başka değerli veriler olacaktır.
Aşağıdaki yöntem, dizeyi güvenli dizeye dönüştürmeye yardımcı olur
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;
}
Bunu takip edebilirsiniz:
string password = "test";
SecureString sec_pass = new SecureString();
Array.ForEach(password.ToArray(), sec_pass.AppendChar);
sec_pass.MakeReadOnly();
İşte ucuz bir linq numarası.
SecureString sec = new SecureString();
string pwd = "abc123"; /* Not Secure! */
pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
/* and now : seal the deal */
sec.MakeReadOnly();
Bunu oraya atacağım. Neden?
Dizeleri güvenli hale getirmek için tüm dizelerinizi değiştiremezsiniz ve aniden uygulamanız "güvenli" olur. Güvenli dize, dizeyi olabildiğince uzun süre şifrelenmiş halde tutmak için tasarlanmıştır ve yalnızca çok kısa bir süre için şifresi çözülerek, üzerinde bir işlem gerçekleştirildikten sonra belleği siler.
Uygulama dizelerinizin güvenliğini sağlamak için endişelenmeden önce ilgilenmeniz gereken bazı tasarım düzeyi sorunlarınız olabileceğini söyleyemem. Ne yapmaya çalıştığınız hakkında bize biraz daha bilgi verin, size daha iyi yardımcı olabiliriz.
süslü bağlantı yok, tüm karakterleri elle eklemiyor, sadece sade ve basit:
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);
Sadece "böyle en değil noktası tüm insanlar söyleyerek işaret etmek istiyorum SecureString
bu soruyu soran insanların çoğu ne olursa olsun haklı ya da değil sebebi, için, onlar vardır, bir uygulamada olabileceğini," değil özellikle sahip endişe şifrenin geçici bir kopyası, yığın üzerinde GC uyumlu bir dize olarak bulunur, ancak yalnızcaSecureString
nesneleri kabul eden bir API kullanmaları gerekir . Yani, umursamadığınız bir uygulamanız varParola yığın üzerinde olsun, belki yalnızca dahili kullanımdır ve parola yalnızca temeldeki ağ protokolleri tarafından gerekli olduğu için mevcuttur ve parolanın depolandığı dizenin, örneğin uzak bir PowerShell kurmak için kullanılamayacağını görürsünüz. Runspace - ancak SecureString
ihtiyacınız olanı yaratmak için kolay, doğrudan tek satırlık bir yol yoktur . Bu küçük bir rahatsızlıktır - ancak gerçekten işe yarayan uygulamaların gerek SecureString
kullanımına yazarlar zorlama System.String
veya System.Char[]
aracılar. :-)
Eğer bir dönüşüm sıkıştırmak isterseniz string
bir karşı SecureString
bir içine LINQ
açıklamada şöyle bunu ifade edebiliriz:
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; }
);
Ancak, kullanmanın LINQ
bu çözümün güvenliğini artırmadığını unutmayın . Bu herhangi bir dönüşümle aynı kusur muzdarip string
için SecureString
. Orijinal string
bellekte kaldığı sürece veriler savunmasızdır.
Bununla birlikte, yukarıdaki ifadenin sunabileceği şey SecureString
, verinin oluşturulmasını , başlatılmasını verilerle bir arada tutmak ve son olarak onu değişiklikten kilitlemektir.
Aşağıdaki 2 uzantı hile yapmalı:
Bir char
dizi için
public static SecureString ToSecureString(this char[] _self)
{
SecureString knox = new SecureString();
foreach (char c in _self)
{
knox.AppendChar(c);
}
return knox;
}
Ve için 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;
}
Tavsiye için John Dagg'a teşekkürler AppendChar
.
bu basit betiği kullanabilirsin
private SecureString SecureStringConverter(string pass)
{
SecureString ret = new SecureString();
foreach (char chr in pass.ToCharArray())
ret.AppendChar(chr);
return ret;
}
12345
... bir aptalın valizinde taşıdığı türden bir şey!"