SecureString Osztály

Definíció

Olyan szöveget jelöl, amelyet bizalmasan kell kezelni, például ha törli azt a számítógép memóriájából, amikor már nincs rá szükség. Ez az osztály nem örökölhető.

public ref class SecureString sealed : IDisposable
public sealed class SecureString : IDisposable
type SecureString = class
    interface IDisposable
Public NotInheritable Class SecureString
Implements IDisposable
Öröklődés
SecureString
Megvalósítás

Példák

Az alábbi példa bemutatja, hogyan védhet meg egy SecureString felhasználó jelszavát hitelesítő adatként egy új folyamat elindításához.

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Security;

public class Example
{
    public static void Main()
    {
        // Instantiate the secure string.
        SecureString securePwd = new SecureString();
        ConsoleKeyInfo key;

        Console.Write("Enter password: ");
        do {
           key = Console.ReadKey(true);
           
           // Ignore any key out of range.
           if (((int) key.Key) >= 65 && ((int) key.Key <= 90)) {
              // Append the character to the password.
              securePwd.AppendChar(key.KeyChar);
              Console.Write("*");
           }   
        // Exit if Enter key is pressed.
        } while (key.Key != ConsoleKey.Enter);
        Console.WriteLine();
        
        try {
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN");
        }
        catch (Win32Exception e) {
            Console.WriteLine(e.Message);
        }
        finally {
           securePwd.Dispose();
        }
    }
}
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Security

Public Class Example
    Public Shared Sub Main()
        ' Instantiate the secure string.
        Dim securePwd As New SecureString()
        Dim key As ConsoleKeyInfo
        
        Console.Write("Enter password: ")
        Do
           key = Console.ReadKey(True)

           ' Ignore any key out of range
           If CInt(key.Key) >= 65 And CInt(key.Key <= 90) Then    
              ' Append the character to the password.
              securePwd.AppendChar(key.KeyChar)
              Console.Write("*")
           End If                                    
        ' Exit if Enter key is pressed.
        Loop While key.Key <> ConsoleKey.Enter
        Console.WriteLine()
        
        Try
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN")
        Catch e As Win32Exception
            Console.WriteLine(e.Message)
        Finally
           securePwd.Dispose()
        End Try
    End Sub
End Class

Megjegyzések

Important

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

Note

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 karakterláncok tárolását a folyamatmemóriában szöveg formátumban. (A korlátozásokról azonban tekintse meg a SecureString biztonságossá tételét ismertető szakaszt .) 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.

Egy SecureString példány maximális hossza 65 536 karakter.

Important

Ez a típus implementálja a IDisposable felületet. Ha befejezte a típus használatát, közvetlenül (a metódus meghívásával) vagy közvetetten (például using a C#-ban) kell elhelyeznie Dispose a típust. További információ: Az IDisposable-t megvalósító objektum használata.

Az SecureString osztály és tagjai nem láthatók a COM számára. További információért lásd 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 példányok nem módosíthatók, azok a műveletek, amelyek úgy tűnnek, hogy egy meglévő példányt módosítanak, valójában egy másolatot hoznak létre azok módosításához. 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. Egy objektum értéke SecureString azonban:

  • Rögzítve van a memóriában.
  • Használhat egy védelmi mechanizmust, például a titkosítást, amelyet az alapul szolgáló operációs rendszer biztosít.
  • Módosítható, amíg az alkalmazás írásvédettként nem jelöli meg.
  • A számítógép memóriájából törölhető a metódust hívó Dispose alkalmazás vagy a .NET szemétgyűjtő.

A SecureString osztály korlátairól bővebben a How secure is SecureString? (Mennyire biztonságos a SecureString?) szakaszban olvashat.

SecureString-műveletek

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

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

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

Important

A SecureString objektumot soha nem szabad String-ból létrehozni, mert a bizalmas adatok már ki vannak téve a nem módosítható String osztály memória-megőrzési hatásainak. Az egy objektum létrehozásának legjobb módja egyenként karakterekből egy nem menedzselt forrásból, például a SecureString metódusból.

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 SecureString példány számára lefoglalt memória felszabadítása. Mivel a SecureString megvalósítja a IDisposable interfészt, a memóriát a Dispose metódus meghívásával szabadíthatja fel.

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álykönyvtár általánosan a következő módokon használja a SecureString 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, nullázza és felszabadítsa 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 karakterenkénti forrásból hoz létre sztringet, String több köztes példányt hoz létre a memóriában, míg SecureString csak egyetlen példányt hoz létre. A String objektumok szemétgyűjtése 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 időintervallum, amely alatt a SecureString példány értéke látható, csupán rövidebb az String osztályéhoz képest.

  • Tárolás és használat

    Általánosságban elmondható, hogy az SecureString osztály egy olyan tárolási mechanizmust határoz meg a sztringértékekhez, amelyeket védeni vagy bizalmasan kell kezelni. 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 a SecureString biztonságosabb, mint a String, mert korlátozza a bizalmas adatok expozícióját. Előfordulhat azonban, hogy ezek a karaktersorozatok 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 folyamatlerakódásnak vagy egy felhasználó által megtekinthető swap 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.

Konstruktorok

Name Description
SecureString()

Inicializálja a SecureString osztály új példányát.

SecureString(Char*, Int32)

Inicializálja az osztály új példányát az SecureString objektumok egy alarrájából Char .

Ez a konstruktor nem CLS-kompatibilis. A CLS-kompatibilis alternatíva a SecureString().

Tulajdonságok

Name Description
Length

Lekéri az aktuális biztonságos sztringben szereplő karakterek számát.

Metódusok

Name Description
AppendChar(Char)

Hozzáfűz egy karaktert az aktuális biztonságos sztring végéhez.

Clear()

Törli az aktuális biztonságos sztring értékét.

Copy()

Létrehozza az aktuális biztonságos sztring másolatát.

Dispose()

Felszabadítja az aktuális SecureString objektum által használt összes erőforrást.

Equals(Object)

Meghatározza, hogy a megadott objektum egyenlő-e az aktuális objektummal.

(Öröklődés forrása Object)
GetHashCode()

Ez az alapértelmezett kivonatoló függvény.

(Öröklődés forrása Object)
GetType()

Lekéri az Type aktuális példányt.

(Öröklődés forrása Object)
InsertAt(Int32, Char)

Beszúr egy karaktert ebbe a biztonságos sztringbe a megadott indexpozícióban.

IsReadOnly()

Azt jelzi, hogy ez a biztonságos sztring írásvédettként van-e megjelölve.

MakeReadOnly()

A biztonságos sztring szöveges értékét írásvédetté teszi.

MemberwiseClone()

Az aktuális Objectpéldány sekély másolatát hozza létre.

(Öröklődés forrása Object)
RemoveAt(Int32)

Eltávolítja a megadott indexpozícióban lévő karaktert ebből a biztonságos sztringből.

SetAt(Int32, Char)

A megadott indexpozícióban lévő meglévő karaktert lecseréli egy másik karakterre.

ToString()

Az aktuális objektumot jelképező sztringet ad vissza.

(Öröklődés forrása Object)

A következőre érvényes:

Lásd még