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í.
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.
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í.
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ěť:
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.
Spolupracujte s námi na GitHubu
Zdroj tohoto obsahu najdete na GitHubu, kde můžete také vytvářet a kontrolovat problémy a žádosti o přijetí změn. Další informace najdete v našem průvodci pro přispěvatele.
Zpětná vazba k produktu .NET
.NET je open source projekt. Vyberte odkaz pro poskytnutí zpětné vazby:
Secure software development means integrating security into each phase of your development lifecycle, from requirements analysis to maintenance. Microsoft provides many services that can help you develop more secure code and deploy a more secure application in the cloud. This learning path provides an overview of the services and offerings available to help you build secure software as part of a cybersecurity solution.The deadline for agencies to comply with NIST/CISA/OMB guidance on security measures for c