Delen via


System.Security.SecureString-klasse

Belangrijk

U wordt aangeraden de SecureString klasse niet te gebruiken voor nieuwe ontwikkeling op .NET (Core) of wanneer u bestaande code migreert naar .NET (Core). Zie SecureString mag niet worden gebruikt voor meer informatie.

In dit artikel vindt u aanvullende opmerkingen in de referentiedocumentatie voor deze API.

SecureString is een tekenreekstype dat een beveiligingsmaatregel biedt. Het probeert te voorkomen dat mogelijk gevoelige tekenreeksen worden opgeslagen in procesgeheugen als tekst zonder opmaak. (Zie voor beperkingen echter de Hoe veilig is SecureString? sectie.) De waarde van een exemplaar van wordt automatisch beveiligd met behulp van SecureString een mechanisme dat wordt ondersteund door het onderliggende platform wanneer het exemplaar wordt geïnitialiseerd of wanneer de waarde wordt gewijzigd. Uw toepassing kan het exemplaar onveranderbaar maken en verdere wijzigingen voorkomen door de MakeReadOnly methode aan te roepen.

De maximale lengte van een SecureString exemplaar is 65.536 tekens.

Belangrijk

Met dit type wordt de IDisposable interface geïmplementeerd. Wanneer u klaar bent met het gebruik van een exemplaar van het type, moet u deze direct of indirect verwijderen. Als u het type rechtstreeks wilt verwijderen, roept u de Dispose methode aan in een try/catch blok. Als u deze indirect wilt verwijderen, gebruikt u een taalconstructie zoals using (in C#) of Using (in Visual Basic). Zie de sectie 'Using an Object that Implements IDisposable' (Een object gebruiken dat IDisposable implementeert) in het IDisposable interfaceonderwerp voor meer informatie.

De SecureString klas en de leden zijn niet zichtbaar voor COM. Voor meer informatie raadpleegt u ComVisibleAttribute.

Tekenreeks versus SecureString

Een exemplaar van de System.String klasse is zowel onveranderbaar als, wanneer deze niet meer nodig is, niet programmatisch kan worden gepland voor garbagecollection. Dat wil zeggen dat het exemplaar alleen-lezen is nadat deze is gemaakt en het niet mogelijk is te voorspellen wanneer het exemplaar uit het computergeheugen wordt verwijderd. Omdat System.String exemplaren onveranderbaar zijn, maken bewerkingen die een bestaand exemplaar lijken te wijzigen, daadwerkelijk een kopie van het exemplaar om te bewerken. Als een String object dus gevoelige informatie bevat, zoals een wachtwoord, creditcardnummer of persoonlijke gegevens, bestaat er een risico dat de informatie kan worden weergegeven nadat deze is gebruikt omdat uw toepassing de gegevens niet uit het computergeheugen kan verwijderen.

Een SecureString object is vergelijkbaar met een String object omdat het een tekstwaarde heeft. De waarde van een SecureString object wordt echter vastgemaakt in het geheugen, kan een beveiligingsmechanisme gebruiken, zoals versleuteling, geleverd door het onderliggende besturingssysteem, kan worden gewijzigd totdat uw toepassing het als alleen-lezen markeert en kan worden verwijderd uit het computergeheugen door uw toepassing die de Dispose methode aanroept of door de .NET-garbagecollector.

Zie de sectie Hoe veilig is SecureString? voor een bespreking van de beperkingen van de SecureString klasse.

SecureString-bewerkingen

De SecureString klasse bevat leden waarmee u het volgende kunt doen:

Instantieer een SecureString object Dat u een SecureString object instantiëren door de parameterloze constructor aan te roepen.

Tekens toevoegen aan een SecureString object U kunt één teken tegelijk aan een SecureString object toevoegen door de bijbehorende of InsertAt methode aan te roepenAppendChar.

Belangrijk

Een SecureString object mag nooit worden samengesteld op basis van een String, omdat de gevoelige gegevens al onderhevig zijn aan de gevolgen van geheugenpersistentie van de onveranderbare String klasse. De beste manier om een SecureString object te maken, is afkomstig van een niet-beheerde teken-op-een-tijd-bron, zoals de Console.ReadKey methode.

Tekens uit een SecureString object verwijderen U kunt een afzonderlijk teken vervangen door de SetAt methode aan te roepen, een afzonderlijk teken te verwijderen door de RemoveAt methode aan te roepen of alle tekens uit het SecureString exemplaar te verwijderen door de methode aan te Clear roepen.

Maak het SecureString object alleen-lezen zodra u de tekenreeks hebt gedefinieerd die het SecureString object vertegenwoordigt, roept u de methode aan MakeReadOnly om de tekenreeks alleen-lezen te maken.

Informatie ophalen over het SecureString object De SecureString klasse heeft slechts twee leden die informatie geven over de tekenreeks: Length de eigenschap, die het aantal UTF16-gecodeerde code-eenheden in de tekenreeks aangeeft; en de IsReadOnlymethode , die aangeeft of het exemplaar het kenmerk Alleen-lezen heeft.

Laat het toegewezen geheugen los aan het SecureString exemplaar omdat SecureString de IDisposable interface wordt geïmplementeerd, laat u het geheugen los door de Dispose methode aan te roepen.

De SecureString klasse heeft geen leden die de waarde van een SecureString. Het ontbreken van dergelijke leden helpt de waarde van het exemplaar te beschermen tegen onbedoelde of schadelijke blootstelling. Gebruik de juiste leden van de System.Runtime.InteropServices.Marshal klasse, zoals de SecureStringToBSTR methode, om de waarde van een SecureString object te bewerken.

De .NET-klassebibliotheek maakt SecureString vaak gebruik van exemplaren op de volgende manieren:

SecureString en interop

Omdat het besturingssysteem niet rechtstreeks ondersteuning biedt SecureString, moet u de waarde van het SecureString object converteren naar het vereiste tekenreekstype voordat u de tekenreeks doorgeeft aan een systeemeigen methode. De Marshal klasse heeft vijf methoden die dit doen:

Elk van deze methoden maakt een tekenreeks zonder tekst in onbeheerd geheugen. Het is de verantwoordelijkheid van de ontwikkelaar om uit te vallen en dat geheugen vrij te maken zodra het niet meer nodig is. Elk van de methoden voor het converteren van tekenreeksen en geheugentoewijzingen heeft een bijbehorende methode om het toegewezen geheugen uit te voeren en vrij te maken:

Toewijzings- en conversiemethode Nul en gratis methode
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

Hoe veilig is SecureString?

Wanneer een exemplaar correct is gemaakt, biedt een SecureString exemplaar meer gegevensbeveiliging dan een String. Wanneer u een tekenreeks maakt op basis van een teken-op-een-tijdbron, String maakt u meerdere tussenliggende items in het geheugen, terwijl SecureString er slechts één exemplaar wordt gemaakt. Garbagecollection van String objecten is niet-deterministisch. Omdat het geheugen niet is vastgemaakt, maakt de garbagecollector extra kopieën van waarden bij het verplaatsen en comprimeren van String geheugen. Het geheugen dat aan een SecureString object is toegewezen, wordt daarentegen vastgemaakt en dat geheugen kan worden vrijgemaakt door de Dispose methode aan te roepen.

Hoewel gegevens die zijn opgeslagen in een SecureString exemplaar veiliger zijn dan gegevens die zijn opgeslagen in een String exemplaar, gelden er aanzienlijke beperkingen voor hoe veilig een SecureString exemplaar is. Deze omvatten:

Platform

Op het Windows-besturingssysteem wordt de inhoud van de interne tekenmatrix van een SecureString exemplaar versleuteld. Vanwege ontbrekende API's of problemen met sleutelbeheer is versleuteling echter niet beschikbaar op alle platforms. Vanwege deze platformafhankelijkheid SecureString versleutelt u de interne opslag niet op een niet-Windows-platform. Andere technieken worden op deze platforms gebruikt om extra beveiliging te bieden.

Duur

Zelfs als de SecureString implementatie kan profiteren van versleuteling, kan de tekst zonder opmaak die aan het SecureString exemplaar is toegewezen, op verschillende momenten worden weergegeven:

  • Omdat Windows geen veilige tekenreeks-implementatie biedt op besturingssysteemniveau, moet .NET de waarde van de beveiligde tekenreeks nog steeds converteren naar de weergave van tekst zonder opmaak om deze te kunnen gebruiken.

  • Wanneer de waarde van de beveiligde tekenreeks wordt gewijzigd door methoden zoals AppendChar of RemoveAt, moet deze worden ontsleuteld (dat wil gezegd, weer geconverteerd naar tekst zonder opmaak), gewijzigd en vervolgens opnieuw worden versleuteld.

  • Als de beveiligde tekenreeks wordt gebruikt in een interoperabiliteitsaanroep, moet deze worden geconverteerd naar een ANSI-tekenreeks, een Unicode-tekenreeks of een binaire tekenreeks (BSTR). Zie de sectie SecureString en interop voor meer informatie.

Het tijdsinterval waarvoor de waarde van het SecureString exemplaar wordt weergegeven, wordt slechts ingekort in vergelijking met de String klasse.

Opslag versus gebruik In het algemeen definieert de SecureString klasse een opslagmechanisme voor tekenreekswaarden die moeten worden beveiligd of vertrouwelijk moeten worden bewaard. Buiten .NET zelf wordt echter geen gebruiksmechanisme ondersteund SecureString. Dit betekent dat de beveiligde tekenreeks moet worden geconverteerd naar een bruikbaar formulier (meestal een duidelijke tekstvorm) die kan worden herkend door het doel en dat ontsleuteling en conversie moeten plaatsvinden in de gebruikersruimte.

Over het algemeen is het SecureString veiliger dan String omdat hiermee de blootstelling van gevoelige tekenreeksgegevens wordt beperkt. Deze tekenreeksen kunnen echter nog steeds worden blootgesteld aan elk proces of elke bewerking die toegang heeft tot onbewerkt geheugen, zoals een schadelijk proces dat wordt uitgevoerd op de hostcomputer, een procesdump of een wisselbestand dat door de gebruiker kan worden weergegeven. In plaats van SecureString wachtwoorden te beveiligen, is het aanbevolen om een ondoorzichtige ingang te gebruiken voor referenties die buiten het proces zijn opgeslagen.