Odpowiedzi:
Ty nie. Cały powód używania obiektu SecureString polega na tym, aby uniknąć tworzenia obiektu typu string (który jest ładowany do pamięci i przechowywany w postaci zwykłego tekstu do czasu wyczyszczenia). Możesz jednak dodawać znaki do SecureString, dołączając je.
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');
12345
… takie rzeczy ma idiota w swoim bagażu!”
*****
AppendChar
nie jest wykonywany przed uruchomieniem, więc te znaki można nadal odczytać z IL, prawda? Może przydałoby się również zaciemnianie w czasie kompilacji ... to znaczy, jeśli na stałe wpisujesz hasła.
Istnieje również inny sposób konwersji między SecureString
i String
.
1. Ciąg do SecureString
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2. SecureString to String
string theString = new NetworkCredential("", theSecureString).Password;
Oto link
SecureString
jeśli twój kod tworzy string
obiekt o wartości, którą chcesz zabezpieczyć. Celem SecureString
jest uniknięcie umieszczenia ciągu w zarządzanej pamięci, aby osoba atakująca badająca tę pamięć mogła wykryć wartość, którą chcesz ukryć. Ponieważ NetworkCredential
konstruktor, który wywołujesz, wymaga ciągu, to nie jest droga ... Jasne, twój kod jest łatwym sposobem na konwersję do iz SecureString, ale użycie go sprawia, że twój kod jest tak bezpieczny, jak użycie prostegostring
SecureString
podczas pracy z niektórymi bibliotekami. I bądźmy szczerzy, jeśli ktoś aktywnie skanuje pamięć twojej aplikacji, to już przegrałeś. Nawet jeśli poprawnie użyłeś SecureString, czego nigdy nie widziałem, do wyodrębnienia będą inne cenne dane.
poniższa metoda pomaga przekonwertować ciąg na bezpieczny ciąg
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;
}
Oto tania sztuczka z linq.
SecureString sec = new SecureString();
string pwd = "abc123"; /* Not Secure! */
pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
/* and now : seal the deal */
sec.MakeReadOnly();
Wyrzucę to tam. Czemu?
Nie możesz po prostu zmienić wszystkich swoich ciągów na bezpieczne i nagle Twoja aplikacja jest „bezpieczna”. Bezpieczny ciąg został zaprojektowany tak, aby łańcuch był zaszyfrowany tak długo, jak to możliwe, i był odszyfrowywany tylko przez bardzo krótki czas, czyszcząc pamięć po wykonaniu na nim operacji.
Zaryzykowałbym stwierdzenie, że możesz mieć pewne problemy na poziomie projektowym, z którymi musisz się uporać, zanim zaczniesz martwić się o zabezpieczenie ciągów aplikacji. Podaj nam więcej informacji o tym, co próbujesz zrobić, a być może będziemy w stanie pomóc lepiej.
bez fantazyjnego linq, nie dodawanie wszystkich znaków ręcznie, po prostu proste i proste:
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);
Chcę tylko zwrócić uwagę, aby wszyscy ludzie, mówiąc: „To nie jest sens SecureString
”, że wielu ludzi zadaje to pytanie może być w aplikacji, w którym, niezależnie od przyczyny, uzasadniony, czy nie, są one nie szczególnie zaniepokojony konieczności tymczasowa kopia hasła znajduje się na stercie jako ciąg znaków GC, ale musi używać interfejsu API, który akceptuje tylkoSecureString
obiekty. Masz więc aplikację, w której nic Cię nie obchodziczy hasło jest na stercie, może jest tylko do użytku wewnętrznego, a hasło istnieje tylko dlatego, że jest wymagane przez podstawowe protokoły sieciowe, i okazuje się, że ten ciąg, w którym jest przechowywane hasło, nie może być użyty do np. skonfigurowania zdalnego PowerShell Runspace - ale nie ma łatwego, prostego, jednego liniowca, aby stworzyć to SecureString
, czego potrzebujesz. Jest to drobne niedogodności - ale chyba warto, aby zapewnić, że aplikacje, które naprawdę zrobić musi SecureString
nie kusił autorów do użycia System.String
lub System.Char[]
pośredników. :-)
Jeśli chcesz skompresować konwersję a string
do a SecureString
w LINQ
instrukcję, możesz to wyrazić w następujący sposób:
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; }
);
Należy jednak pamiętać, że używanie LINQ
nie poprawia bezpieczeństwa tego rozwiązania. Cierpi na tę samą wadę, co każda konwersja z string
na SecureString
. Dopóki oryginał string
pozostaje w pamięci, dane są podatne na ataki.
Mając to na uwadze, powyższe oświadczenie może zaoferować utrzymanie razem tworzenia pliku SecureString
, jego inicjalizację z danymi i ostatecznie zablokowanie go przed modyfikacją.
Poniższe 2 rozszerzenia powinny załatwić sprawę:
Dla char
tablicy
public static SecureString ToSecureString(this char[] _self)
{
SecureString knox = new SecureString();
foreach (char c in _self)
{
knox.AppendChar(c);
}
return knox;
}
I dla 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;
}
Podziękowania dla Johna Dagga za AppendChar
rekomendację.
możesz użyć tego prostego skryptu
private SecureString SecureStringConverter(string pass)
{
SecureString ret = new SecureString();
foreach (char chr in pass.ToCharArray())
ret.AppendChar(chr);
return ret;
}
Array.Clear