SecureString Osztály
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
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:
- Jelszóadatok megadása egy folyamathoz a ProcessStartInfo struktúra használatával vagy a Process.Start metódus túlterhelésének meghívásával, amely egy típusú SecureStringparaméterrel rendelkezik.
- Hálózati jelszóadatok megadása egy NetworkCredential típusparaméterrel SecureString rendelkező osztálykonstruktor meghívásával vagy a NetworkCredential.SecurePassword tulajdonság használatával.
- Jelszóadatok megadása az SQL Server-hitelesítéshez a SqlCredential.SqlCredential konstruktor meghívásával vagy a SqlCredential.Password tulajdonság értékének beolvasásával.
- Sztring átadása kezeletlen kódnak. További információkért lásd a SecureString és az interop szakaszt .
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:
- Marshal.SecureStringToBSTR, amely a SecureString sztringértéket COM által felismert bináris sztringgé (BSTR) alakítja át.
- Marshal.SecureStringToCoTaskMemAnsi és Marshal.SecureStringToGlobalAllocAnsi, amely a SecureString sztringértéket nem felügyelt memóriában lévő ANSI-sztringre másolja.
- Marshal.SecureStringToCoTaskMemUnicode és Marshal.SecureStringToGlobalAllocUnicode, amely a SecureString sztring értékét egy Unicode-sztringre másolja nem felügyelt memóriában.
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:
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) |