Sdílet prostřednictvím


třída System.Security.SecureString

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 části Jak zabezpečený je SecureString ?) 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 rozhraní IDisposable. Po dokončení použití instance typu byste ho měli odstranit buď přímo nebo nepřímo. Chcete-li typ odstranit přímo, zavolejte jeho Dispose metodu v bloku try/catch. Pokud ho chcete zlikvidovat nepřímo, použijte konstruktor jazyka, jako je 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 v tématu ComVisibleAttribute.

Řetězec versus SecureString

Instance System.String třídy je neměnná, a to i tehdy, když už ji nepotřebujete; její uvolnění z paměti nelze naplánovat programovým způsobem. To znamená, že instance je po vytvoření pouze pro čtení a není možné předpovědět, kdy bude odstraněna 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 využít mechanismus ochrany, jako je šifrování poskytované základním operačním systémem, a lze ji upravovat, dokud vaše aplikace neoznačí jako jen pro čtení, a může být odstraněna z paměti počítače buď voláním metody Dispose, 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 po znacích, například pomocí Console.ReadKey metody.

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ří čistý textový řetězec do nespravované paměti. Vývojář je povinen vynulovat a uvolnit tuto paměť, jakmile již není potřeba. 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 vytvoření instance SecureString poskytuje větší ochranu dat než String. Při vytváření řetězce ze zdroje, který zpracovává znaky postupně, vytvoří String více zprostředkujících objektů v paměti, zatímco SecureString vytvoří pouze jedinou instanci. Odstraňování objektů String není deterministické. Vzhledem k tomu, že paměť není připnutá, systém uvolňování paměti při přemísťová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. Patří mezi ně:

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 interoperabilita.

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

Třída SecureString definuje mechanismus uchovávání pro řetězcové hodnoty, které by měly být chráněny nebo uchovány důvěrné, a obecněji řeší otázku uchovávání oproti použití. Mimo samotnou technologii .NET však žádný mechanismus nepodporuje použití SecureString. 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 uživatelem viditelný soubor pro výměnu. Místo použití SecureString k ochraně hesel se doporučuje alternativně použít neprůhledný popisovač přihlašovacích údajů uložených mimo proces.