System.Security.SecureString – třída

Důležité

Doporučujeme nepoužívat třídu pro nový vývoj v .NET (Core) nebo při migraci existujícího SecureString kódu do .NET (Core). Další informace naleznete v tématu SecureString by neměl být použit.

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

SecureString je typ řetězce, který poskytuje míru zabezpečení. Snaží se zabránit ukládání potenciálně citlivých řetězců do procesní paměti jako prostého textu. (Omezení však najdete v tématu Jak zabezpečený je SecureString? oddíl.) Hodnota instance SecureString je automaticky chráněna pomocí mechanismu podporovaného základní platformou při inicializaci instance nebo při změně hodnoty. Aplikace může instanci vykreslit neměnnou a zabránit další úpravě vyvoláním MakeReadOnly metody.

Maximální délka SecureString instance je 65 536 znaků.

Důležité

Tento typ implementuje IDisposable rozhraní. Po dokončení použití instance typu byste ho měli odstranit buď přímo nebo nepřímo. Chcete-li odstranit typ přímo, zavolejte jeho Dispose metodu try/catch v bloku. Pokud ho chcete zlikvidovat nepřímo, použijte konstruktor jazyka, například using (v jazyce C#) nebo Using (v jazyce Visual Basic). Další informace naleznete v části Použití objektu, který implementuje IDisposable v IDisposable tématu rozhraní.

Třída SecureString a její členy nejsou viditelné modelu COM. Další informace najdete na webu ComVisibleAttribute.

Řetězec versus SecureString

Instance System.String třídy je neměnná i v případě, že už ji nepotřebujete, nelze programově naplánovat pro uvolňování paměti. To znamená, že instance je po vytvoření jen pro čtení a není možné předpovědět, kdy se instance odstraní z paměti počítače. Vzhledem k tomu System.String , že instance jsou neměnné, operace, které se jeví jako úprava existující instance, ve skutečnosti vytvoří jeho kopii pro manipulaci. Pokud tedy objekt obsahuje citlivé informace, String jako je heslo, číslo platební karty nebo osobní údaje, může dojít k riziku, že se tyto informace můžou odhalit, protože vaše aplikace nemůže odstranit data z paměti počítače.

Objekt SecureString je podobný objektu String , který má textovou hodnotu. Hodnota objektu SecureString je však připnuta v paměti, může použít mechanismus ochrany, jako je šifrování poskytované základním operačním systémem, lze upravit, dokud aplikace označí jako jen pro čtení a může být odstraněna z paměti počítače buď voláním Dispose metody, nebo systémem uvolňování paměti .NET.

Diskuzi o omezeních SecureString třídy najdete v části Jak zabezpečený je SecureString?

Operace SecureString

Třída SecureString obsahuje členy, které umožňují provádět následující akce:

Vytvoření instance objektu SecureString Vytvoříte instanci SecureString objektu zavoláním jeho konstruktoru bez parametrů.

Přidat znaky do objektu SecureString Můžete přidat jeden znak najednou k SecureString objektu voláním jeho AppendChar nebo InsertAt metody.

Důležité

SecureString Objekt by nikdy neměl být vytvořen z objektu String, protože citlivá data již podléhají důsledkům trvalosti paměti neměnné String třídy. Nejlepší způsob, jak vytvořit SecureString objekt, je z nespravovaného zdroje typu character-at-a-time, jako Console.ReadKey je například metoda.

Odeberte znaky z objektu SecureString Můžete nahradit jednotlivé znaky voláním SetAt metody, odebráním jednotlivého znaku voláním RemoveAt metody nebo odebráním všech znaků z SecureString instance voláním Clear metody.

SecureString Nastavit objekt jen pro čtení Jakmile definujete řetězec, který SecureString objekt představuje, zavoláte jeho MakeReadOnly metodu, aby byl řetězec jen pro čtení.

Získejte informace o SecureString objektu SecureString Třída má pouze dva členy, které poskytují informace o řetězci: jeho Length vlastnost, která označuje počet jednotek kódu kódování UTF16 v řetězci; a IsReadOnlymetoda, která označuje, zda instance je jen pro čtení.

Uvolněte paměť přidělenou SecureString instanci Protože SecureString implementuje IDisposable rozhraní, uvolníte jeho paměť voláním Dispose metody.

Třída SecureString nemá žádné členy, které kontrolují, porovnávají nebo převádějí hodnotu objektu SecureString. Absence těchto členů pomáhá chránit hodnotu instance před náhodným nebo škodlivým ohrožením. K manipulaci s hodnotou objektu System.Runtime.InteropServices.Marshal použijte příslušné členy třídy, například SecureStringToBSTR metodu SecureString .

Knihovna tříd .NET obvykle používá SecureString instance následujícími způsoby:

SecureString a interoperabilita

Vzhledem k tomu, že operační systém přímo nepodporuje SecureString, je nutné před předáním řetězce do nativní metody převést hodnotu SecureString objektu na požadovaný typ řetězce. Třída Marshal má pět metod, které to dělají:

Každá z těchto metod vytvoří nespravovaný textový řetězec v nespravované paměti. Je zodpovědností vývojáře, aby vynulil a uvolnil tuto paměť, jakmile už ji nepotřebujete. Každá metoda převodu řetězců a přidělení paměti má odpovídající metodu, která vynuluje a uvolní přidělenou paměť:

Metoda přidělování a převodu Nulová a bezplatná metoda
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

Jak zabezpečený je SecureString?

Při správném SecureString vytvoření instance poskytuje větší ochranu dat než .String Při vytváření řetězce ze zdroje znaku v čase vytvoří String více zprostředkujících v paměti, zatímco SecureString vytvoří pouze jednu instanci. Uvolňování String paměti objektů není deterministické. Vzhledem k tomu, že paměť není připnutá, systém uvolňování paměti při přesouvání a komprimování paměti vytvoří další kopie String hodnot. Naproti tomu paměť přidělená objektu SecureString je připnuta a tato paměť může být uvolněna voláním Dispose metody.

I když jsou data uložená v SecureString instanci bezpečnější než data uložená v String instanci, existují významná omezení týkající se zabezpečení SecureString instance. Tady jsou některé z nich:

Platforma

V operačním systému Windows se obsah interního SecureString znakového pole instance šifruje. Bez ohledu na to, jestli kvůli chybějícím rozhraním API nebo problémům se správou klíčů není šifrování dostupné na všech platformách. Kvůli závislosti SecureString na této platformě nešifruje interní úložiště na platformě jiné než Windows. Další techniky se na těchto platformách používají k zajištění další ochrany.

Doba trvání

I v případě, že SecureString implementace dokáže využít šifrování, může být prostý text přiřazený instanci SecureString vystaven v různých časech:

  • Vzhledem k tomu, že Systém Windows nenabízí zabezpečenou implementaci řetězců na úrovni operačního systému, musí .NET stále převést hodnotu zabezpečeného řetězce na reprezentaci prostého textu, aby ji bylo možné použít.

  • Kdykoli je hodnota zabezpečeného řetězce upravena metodami, jako AppendChar je nebo RemoveAt, musí být dešifrována (tj. převedena zpět na prostý text), změněna a poté znovu zašifrována.

  • Pokud se zabezpečený řetězec používá při volání zprostředkovatele komunikace, musí být převeden na řetězec ANSI, řetězec Unicode nebo binární řetězec (BSTR). Další informace naleznete v části SecureString a zprostředkovatele komunikace .

Časový interval, pro který SecureString je vystavena hodnota instance, je pouze zkrácen ve srovnání s String třídou.

Obecněji platí, SecureString že třída definuje mechanismus úložiště pro řetězcové hodnoty, které by měly být chráněny nebo uchovány důvěrné. Mimo samotnou technologii .NET však nepodporuje žádný mechanismus SecureStringpoužití . To znamená, že zabezpečený řetězec musí být převeden na použitelný formulář (obvykle jasný textový formulář), který lze rozpoznat podle cíle a že dešifrování a převod musí nastat v uživatelském prostoru.

Celkově je bezpečnější, SecureString než String protože omezuje vystavení citlivých řetězcových dat. Tyto řetězce však mohou být stále vystaveny jakémukoli procesu nebo operaci, která má přístup k nezpracované paměti, jako je škodlivý proces spuštěný na hostitelském počítači, výpis procesu nebo soubor prohození s možností zobrazení uživatelem. Místo použití SecureString k ochraně hesel doporučujeme použít neprůhlený popisovač přihlašovacích údajů uložených mimo proces.