Megosztás a következőn keresztül:


System.Security.SecureString osztály

Fontos

Javasoljuk, hogy ne használja az osztályt a SecureString .NET (Core) új fejlesztéséhez, vagy ha a meglévő kódot a .NET-be (Core) migrálja. További információ: SecureString nem használható.

Ez a cikk kiegészítő megjegyzéseket tartalmaz az API referenciadokumentációjához.

SecureString egy olyan sztringtípus, amely biztonsági mértéket biztosít. Megpróbálja elkerülni a potenciálisan bizalmas sztringek tárolását a folyamatmemória egyszerű szövegként. (A korlátozásokról azonban tekintse meg a Mennyire biztonságos a SecureString? szakasz.) Egy példány SecureString értéke automatikusan védett az alapul szolgáló platform által támogatott mechanizmussal a példány inicializálásakor vagy az érték módosításakor. Az alkalmazás a metódus meghívásával megváltoztathatatlanná teheti a példányt, és megakadályozhatja a MakeReadOnly további módosításokat.

A példányok maximális hossza SecureString 65 536 karakter.

Fontos

Ez a típus implementálja az interfészt IDisposable . Ha befejezte a típus egy példányának használatát, közvetlenül vagy közvetve kell megsemmisítenie. A típus közvetlen megsemmisítéséhez hívja meg a metódust Dispose egy try/catch blokkban. Közvetett módon történő elidegenítéséhez használjon olyan nyelvi szerkezetet, mint using a (C#-ban) vagy Using a (Visual Basicben). További információ: "Az IDisposable-t megvalósító objektum használata" című szakasz a IDisposable felület témakörében.

Az SecureString osztály és tagjai nem láthatók a COM számára. További információ: ComVisibleAttribute.

Sztring és SecureString

Az osztály egy példánya System.String nem módosítható, és ha már nincs rá szükség, nem ütemezhető programozott módon a szemétgyűjtésre; vagyis a példány írásvédett lesz a létrehozása után, és nem lehet előre jelezni, hogy mikor törlik a példányt a számítógép memóriájából. Mivel System.String a példányok nem módosíthatók, a meglévő példányokat módosító műveletek ténylegesen létrehoznak egy másolatot a módosításhoz. Következésképpen, ha egy String objektum bizalmas információkat, például jelszót, hitelkártyaszámot vagy személyes adatokat tartalmaz, fennáll a veszélye annak, hogy az adatok a használat után felfedhetők, mert az alkalmazás nem tudja törölni az adatokat a számítógép memóriájából.

Az SecureString objektumok hasonlóak egy String olyan objektumhoz, amelyben szöveges érték van. Az objektum értéke SecureString azonban rögzítve van a memóriában, használhat védelmi mechanizmust, például a mögöttes operációs rendszer által biztosított titkosítást, amíg az alkalmazás írásvédettként nem jelöli meg, és törölhető a számítógép memóriájából a metódust hívó Dispose alkalmazás vagy a .NET szemétgyűjtő használatával.

Az osztály korlátainak SecureString megvitatása: How secure is SecureString? (Mennyire biztonságos a SecureString? szakasz).

SecureString-műveletek

Az SecureString osztály olyan tagokat tartalmaz, amelyek lehetővé teszik a következőket:

Objektum példányosítása SecureString : Az objektum példányosítása SecureString paraméter nélküli konstruktor meghívásával.

Karakterek hozzáadása egy SecureString objektumhoz: Egyszerre egyetlen karaktert adhat hozzá egy SecureString objektumhoz annak vagy InsertAt metódusának AppendChar meghívásával.

Fontos

Az SecureString objektumokat soha nem szabad egyből létrehozni String, mert a bizalmas adatokra már ki vannak téve a nem módosítható String osztály memóriamegőrzési következményei. Az objektumok létrehozásának SecureString legjobb módja egy karakteres, nem felügyelt forrásból, például a Console.ReadKey metódusból származik.

Karakterek eltávolítása egy SecureString objektumból: Az egyes karaktereket lecserélheti a SetAt metódus meghívásával, az egyes karakterek eltávolításával a RemoveAt metódus meghívásával, vagy az összes karakter eltávolításával a SecureString példányból a Clear metódus meghívásával.

SecureString Az objektum írásvédetté tétele Miután definiálta az SecureString objektum által képviselt sztringet, meghívja annak metódusátMakeReadOnly, hogy a sztring írásvédett legyen.

Információk lekérése az SecureString objektumról: Az SecureString osztálynak csak két tagja van, amelyek információt nyújtanak a sztringről: a tulajdonsága Length , amely az UTF16 kódolású kódegységek számát jelzi a sztringben, valamint a IsReadOnly, metódus, amely azt jelzi, hogy a példány írásvédett-e.

A példány számára SecureString lefoglalt memória felszabadítása Mivel SecureString a IDisposable felület implementálva van, a metódus meghívásával szabadíthatja fel a Dispose memóriát.

Az SecureString osztálynak nincsenek olyan tagjai, amelyek megvizsgálják, összehasonlítják vagy átalakítják egy adott osztály értékét SecureString. Az ilyen tagok hiánya segít megvédeni a példány értékét a véletlen vagy rosszindulatú expozíciótól. Az objektum értékének módosításához használja az System.Runtime.InteropServices.Marshal osztály megfelelő tagjait, például a SecureStringToBSTR metódust SecureString .

A .NET-osztálytár gyakran a következő módokon használja SecureString a példányokat:

SecureString és interop

Mivel az operációs rendszer nem támogatja SecureStringközvetlenül, az SecureString objektum értékét a szükséges sztringtípusra kell konvertálnia, mielőtt a sztringet natív metódussá továbbítja. Az Marshal osztály öt metódust használ:

Ezek a metódusok egy világos szöveges sztringet hoznak létre a nem felügyelt memóriában. A fejlesztő felelőssége, hogy mihelyst már nincs rá szükség, ki kell szabadítanák és felszabadítják ezt a memóriát. A sztringkonvertálási és memóriafoglalási metódusok mindegyike rendelkezik egy olyan metódussal, amely nullára állítja ki a memóriát, és felszabadítja a lefoglalt memóriát:

Kiosztási és konvertálási módszer Nulla és szabad metódus
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

Mennyire biztonságos a SecureString?

A megfelelő létrehozás esetén a SecureString példányok több adatvédelmet biztosítanak, mint egy String. Ha egy karakteres forrásból hoz létre sztringet, String több köztes értéket hoz létre a memóriában, míg SecureString csak egyetlen példányt hoz létre. Az objektumok szemétgyűjtése String nem determinisztikus. Emellett, mivel a memória nincs rögzítve, a szemétgyűjtő további értékmásolatokat String készít a memória áthelyezésekor és tömörítésekor. Ezzel szemben az objektumhoz SecureString lefoglalt memória rögzítve van, és a memória felszabadítható a Dispose metódus meghívásával.

Bár a SecureString példányokban tárolt adatok biztonságosabbak, mint a String példányokban tárolt adatok, jelentős korlátozások vonatkoznak a SecureString példányok biztonságára. Ezek közé tartoznak:

Platform

A Windows operációs rendszeren a példány belső karaktertömbjének SecureString tartalma titkosítva van. Függetlenül attól, hogy hiányzó API-k vagy kulcskezelési problémák miatt a titkosítás nem érhető el minden platformon. A platformfüggőség SecureString miatt nem titkosítja a belső tárolót nem Windows-platformon. Ezeken a platformokon más technikákat is használnak a további védelem érdekében.

Időtartam

Még akkor is, ha az SecureString implementáció képes kihasználni a titkosítás előnyeit, a példányhoz SecureString rendelt egyszerű szöveg különböző időpontokban jelenhet meg:

  • Mivel a Windows nem nyújt biztonságos sztring-implementációt az operációs rendszer szintjén, a .NET-nek továbbra is át kell alakítania a biztonságos sztring értékét egyszerű szöveges ábrázolására annak használatához.

  • Ha a biztonságos sztring értékét olyan módszerekkel módosítják, mint AppendChar a vagy RemoveAt, vissza kell fejteni (azaz vissza kell alakítani egyszerű szöveggé), módosítani kell, majd újra kell titkosítani.

  • Ha a biztonságos sztringet interop-hívásban használják, azt ANSI-sztringgé, Unicode-sztringgé vagy bináris sztringgé (BSTR) kell konvertálni. További információkért lásd a SecureString és az interop szakaszt .

Az az időintervallum, amelyre a SecureString példány értéke ki van téve, csupán az osztályhoz String képest rövidül.

A tárolás és a használat Általánosabban az SecureString osztály definiál egy tárolási mechanizmust a védett vagy bizalmasan kezelendő sztringértékekhez. A .NET-en kívül azonban egyetlen használati mechanizmus sem támogatja SecureString. Ez azt jelenti, hogy a biztonságos sztringet használható űrlapmá (általában egyértelmű szöveges űrlaptá) kell konvertálni, amelyet a cél felismerhet, és a visszafejtésnek és az átalakításnak a felhasználói térben kell történnie.

Összességében biztonságosabb, SecureString mint String az, hogy korlátozza a bizalmas sztringadatok expozícióját. Előfordulhat azonban, hogy ezek a sztringek továbbra is ki vannak téve a nyers memóriához hozzáféréssel rendelkező folyamatoknak vagy műveleteknek, például a gazdagépen futó rosszindulatú folyamatnak, egy folyamatképnek vagy egy felhasználó által megtekinthető felcserélési fájlnak. SecureString A jelszavak védelme helyett az ajánlott alternatíva egy átlátszatlan leíró használata a folyamaton kívül tárolt hitelesítő adatokhoz.