SecureString Sınıf
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Artık gerekmediğinde bilgisayar belleğinden silerek gizli tutulması gereken metni temsil eder. Bu sınıf devralınamaz.
public ref class SecureString sealed : IDisposable
public sealed class SecureString : IDisposable
type SecureString = class
interface IDisposable
Public NotInheritable Class SecureString
Implements IDisposable
- Devralma
-
SecureString
- Uygulamalar
Örnekler
Aşağıdaki örnekte, yeni bir işlem başlatmak üzere kimlik bilgisi olarak kullanmak üzere bir kullanıcının parolasının güvenliğini sağlamak için nasıl kullanılacağı gösterilmektedir SecureString .
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
Açıklamalar
Important
sınıfını SecureString .NET (Core) üzerinde yeni geliştirme için veya .NET Framework'ten geçiş yaparken kullanmamanızı öneririz. Daha fazla bilgi için bkz. SecureString kullanılmamalıdır.
Note
Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.
SecureString , güvenlik ölçüsü sağlayan bir dize türüdür. İşlem belleğinde hassas olabilecek dizelerin düz metin olarak depolanmasını önlemeye çalışır. (Bununla birlikte, sınırlamalar için SecureString ne kadar güvenli? bölümüne bakın.) Örneğinin değeri, örnek SecureString başlatıldığında veya değiştirildiğinde temel alınan platform tarafından desteklenen bir mekanizma kullanılarak otomatik olarak korunur. Uygulamanız örneği sabit hale getirir ve yöntemini çağırarak MakeReadOnly daha fazla değişiklik yapılmasını önleyebilir.
Bir SecureString örneğinin maksimum uzunluğu 65.536 karakterdir.
Important
Bu tür IDisposable arabirimini uygular. Tür örneğinin kullanımını bitirdiğinizde, doğrudan veya dolaylı olarak onu imha etmelisiniz. Türü doğrudan atabilmek için, bir Disposetry/ bloğunda catch yöntemini çağırın. Bunu dolaylı olarak atmak için using (C#'de) veya Using (Visual Basic'te) gibi bir dil yapısı kullanın. Daha fazla bilgi için arabirim konusunun "IDisposable Uygulayan Bir Nesne Kullanma" bölümüne IDisposable bakın.
SecureString sınıfı ve üyeleri COM tarafından görülmeyebilir. Daha fazla bilgi için bkz. ComVisibleAttribute.
Dize ve SecureString karşılaştırması
Sınıfın System.String bir örneği hem sabittir hem de artık gerekli olmadığında, atık toplama için program aracılığıyla zamanlanamaz; yani oluşturulduktan sonra örnek salt okunur olur ve örneğin bilgisayar belleğinden ne zaman silineceğini tahmin etmek mümkün değildir. Örnekler, sabit olduklarından, mevcut bir örneği değiştirmeyi amaçlayan işlemler aslında işlemek için bir kopya oluşturur. Sonuç olarak, bir String nesne parola, kredi kartı numarası veya kişisel veriler gibi hassas bilgiler içeriyorsa, uygulamanız verileri bilgisayar belleğinden semediğinden bilgilerin kullanıldıktan sonra ortaya çıkarılma riski vardır.
Nesne SecureString , içinde metin değerine sahip olan bir String nesneye benzer. Ancak, bir SecureString nesnenin değeri:
- Belleğe sabitlenir.
- Temel işletim sistemi tarafından sağlanan şifreleme gibi bir koruma mekanizması kullanabilir.
- Uygulamanız bunu salt okunur olarak işaretleye kadar değiştirilebilir.
- Uygulamanız yöntemini çağırarak Dispose veya .NET çöp toplayıcısı tarafından bilgisayar belleğinden silinebilir.
Sınıfının sınırlamalarıyla SecureString ilgili bir tartışma için SecureString ne kadar güvenli? bölümüne bakın.
SecureString işlemleri
Bu SecureString sınıfı, size aşağıdakileri yapma imkanı sağlayan üyeler içerir:
SecureString nesnesinin örneğini oluşturma Parametresiz oluşturucusunu çağırarak bir SecureString nesnesinin örneğini oluşturursunuz.
Bir SecureString nesnesine karakter eklemek için SecureString karakterini tek seferde AppendChar veya InsertAt yöntemlerinden birini çağırarak ekleyebilirsiniz.
Important
SecureString nesnesi asla bir String öğesinden oluşturulmamalıdır, çünkü hassas veriler zaten sabit String sınıfının bellek kalıcılığı sonuçlarına tabidir. SecureString nesnesini oluşturmanın en iyi yolu, bir karakter-at-a-time yöntemi olan Console.ReadKey gibi, tek tek karakterlerle yönetilmeyen bir kaynaktan geçmektedir.
Nesneden SecureString karakter kaldırma Yöntemini çağırarak SetAt tek bir karakteri değiştirebilir, yöntemini çağırarak RemoveAt tek bir karakteri kaldırabilir veya yöntemini çağırarak SecureString örnekteki Clear tüm karakterleri kaldırabilirsiniz.
SecureString Nesneyi salt okunur yapma Nesnenin temsil ettiği SecureString dizeyi tanımladıktan sonra, dizeyi salt okunur yapmak için yöntemini çağırırsınızMakeReadOnly.
Nesnesi hakkında SecureString bilgi alma Sınıfı, SecureString dize hakkında bilgi sağlayan yalnızca iki üyeye sahiptir: Length dizedeki UTF16 kodlanmış kod birimlerinin sayısını gösteren özelliği ve IsReadOnlyörneğin salt okunur olup olmadığını gösteren yöntemi.
SecureString örneğine tahsis edilen belleği serbest bırakın. Çünkü SecureString, IDisposable arabirimini uygular, bu nedenle belleği serbest bırakmak için Dispose yöntemini çağırırsınız.
Bu sınıfın, SecureString değerini inceleyen, karşılaştıran veya dönüştüren üyesi SecureString yoktur. Bu tür üyelerin olmaması, örneğin değerinin yanlışlıkla veya kötü amaçlı maruz kalmalara karşı korunmasına yardımcı olur. Bir System.Runtime.InteropServices.Marshal nesnesinin değerini işlemek için, SecureStringToBSTR sınıfının uygun üyelerini, örneğin SecureString yöntemini, kullanın.
.NET Sınıf Kitaplığı, genellikle SecureString örneklerini aşağıdaki şekillerde kullanır:
- Bir işleme parola bilgileri sağlamak için ProcessStartInfo yapısını kullanarak veya türünde bir Process.Start parametresi olan SecureString yönteminin aşırı yüklemesini çağırarak.
- Bir NetworkCredential türünde parametreye sahip bir SecureString sınıf oluşturucusunu çağırarak veya NetworkCredential.SecurePassword özelliğini kullanarak ağ parolası bilgilerini sağlamak için.
- SQL Server Kimlik Doğrulaması için parola bilgilerini, SqlCredential.SqlCredential oluşturucusunu çağırarak veya SqlCredential.Password özelliğinin değerini alarak sağlayın.
- Yönetilmeyen koda bir dize aktarmak için. Daha fazla bilgi için SecureString ve birlikte çalışma bölümüne bakın.
SecureString ve karşılıklı çalışabilirlik
İşletim sistemi doğrudan desteklemediğinden SecureString, dizeyi yerel bir yönteme geçirmeden önce nesnenin SecureString değerini gerekli dize türüne dönüştürmeniz gerekir. sınıfının Marshal bunu yapmak için beş yöntemi vardır:
- Marshal.SecureStringToBSTR, dize değerini COM tarafından tanınan bir ikili dizeye (BSTR) dönüştürür SecureString .
- Marshal.SecureStringToCoTaskMemAnsi ve Marshal.SecureStringToGlobalAllocAnsi, SecureString dize değerini yönetilmeyen bellekteki bir ANSI dizesine kopyalar.
- Marshal.SecureStringToCoTaskMemUnicode ve Marshal.SecureStringToGlobalAllocUnicode, SecureString dize değerini yönetilmeyen bellekteki bir Unicode dizisine kopyalar.
Bu yöntemlerin her biri yönetilmeyen bellekte bir düz metin dizesi oluşturur. Artık gerekli olmadığı anda belleği sıfırlayıp boşaltmak geliştiricinin sorumluluğundadır. Dize dönüştürme ve bellek ayırma yöntemlerinin her biri, ayrılmış belleği sıfırlayıp boşaltmak için karşılık gelen bir yönteme sahiptir:
SecureString ne kadar güvenli?
Düzgün oluşturulduğunda, bir SecureString örnek bir 'den Stringdaha fazla veri koruması sağlar. Bir kerede karakter kaynağından bir dize oluştururken, String bellekte birden çok ara değer oluştururken SecureString , yalnızca tek bir örnek oluşturur. Nesnelerin çöp toplama işlemi String belirleyici değildir. Ayrıca, belleği sabit olmadığı için, çöp toplayıcı bellek taşınırken ve sıkıştırılırken String değerlerinin ek kopyalarını oluşturur. Buna karşılık, bir SecureString nesneye ayrılan bellek sabitlenir ve yöntemi çağrılarak Dispose bu bellek serbestleştirilebilir.
Bir SecureString örneğinde depolanan veriler, bir String örneğinde depolananlardan daha güvenli olsa da, bir SecureString örneğinin ne kadar güvenli olduğu konusunda önemli sınırlamalar vardır. Bunlar şunları içerir:
Platform
Windows işletim sisteminde, bir SecureString örneğin iç karakter dizisinin içeriği şifrelenir. Ancak eksik API'ler veya anahtar yönetimi sorunları nedeniyle şifreleme tüm platformlarda kullanılamaz. Bu platform bağımlılığı nedeniyle, SecureString Windows dışı platformdaki iç depolamayı şifrelemez. Ek koruma sağlamak için bu platformlarda diğer teknikler kullanılır.
Süre
Uygulama SecureString şifrelemeden yararlanabilse bile, SecureString örneğe atanan düz metin çeşitli zamanlarda ortaya çıkabilir.
- Windows, işletim sistemi düzeyinde güvenli bir dize uygulaması sunmadığından, .NET'in kullanmak için güvenli dize değerini düz metin gösterimine dönüştürmesi gerekir.
- Güvenli dizenin değeri AppendChar veya RemoveAt gibi yöntemlerle değiştirildiğinde, şifresi çözülmelidir (yani düz metne geri dönüştürülmelidir), değiştirilmeli ve sonra yeniden şifrelenmelidir.
- Güvenli dize birlikte çalışma çağrısında kullanılıyorsa, bir ANSI dizesine, Unicode dizesine veya ikili dizeye (BSTR) dönüştürülmelidir. Daha fazla bilgi için SecureString ve birlikte çalışma bölümüne bakın.
SecureString örneğinin değerinin ifşa edildiği zaman aralığı, String sınıfı ile karşılaştırıldığında yalnızca kısaltılmıştır.
Depolama ve kullanım karşılaştırması
Daha genel olarak sınıfı, SecureString korunması veya gizli tutulması gereken dize değerleri için bir depolama mekanizması tanımlar. Ancak, .NET'in kendisi dışında hiçbir kullanım mekanizması desteklemez SecureString. Bu, güvenli dizenin hedefi tarafından tanınabilen kullanılabilir bir forma (genellikle net bir metin formu) dönüştürülmesi ve şifre çözme ile dönüştürmenin kullanıcı alanında gerçekleşmesi gerektiği anlamına gelir.
Genel olarak, SecureString hassas dize verilerinin açığa çıkarma durumunu sınırladığı için daha String güvenlidir. Ancak, bu dizeler ana bilgisayarda çalışan kötü amaçlı bir işlem, işlem dökümü veya kullanıcı tarafından görüntülenebilir bir takas dosyası gibi ham belleğe erişimi olan herhangi bir işleme veya işleme açık olmaya devam edebilir. Parolaları korumak için SecureString kullanmak yerine, önerilen alternatif, işlem dışında depolanan kimlik bilgileri için şeffaf olmayan bir tanıtıcı kullanmaktır.
Oluşturucular
| Name | Description |
|---|---|
| SecureString() |
SecureString sınıfının yeni bir örneğini başlatır. |
| SecureString(Char*, Int32) |
Nesnelerin alt dizisinden sınıfının yeni bir örneğini SecureStringChar başlatır. Bu oluşturucu CLS uyumlu değil. CLS uyumlu alternatif SecureString(). |
Özellikler
| Name | Description |
|---|---|
| Length |
Geçerli güvenli dizedeki karakter sayısını alır. |
Yöntemler
| Name | Description |
|---|---|
| AppendChar(Char) |
Geçerli güvenli dizenin sonuna bir karakter ekler. |
| Clear() |
Geçerli güvenli dizenin değerini siler. |
| Copy() |
Geçerli güvenli dizenin bir kopyasını oluşturur. |
| Dispose() |
Geçerli SecureString nesne tarafından kullanılan tüm kaynakları serbest bırakır. |
| Equals(Object) |
Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler. (Devralındığı yer: Object) |
| GetHashCode() |
Varsayılan karma işlevi işlevi görür. (Devralındığı yer: Object) |
| GetType() |
Geçerli örneğin Type alır. (Devralındığı yer: Object) |
| InsertAt(Int32, Char) |
Bu güvenli dizeye belirtilen dizin konumunda bir karakter ekler. |
| IsReadOnly() |
Bu güvenli dizenin salt okunur olarak işaretlenip işaretlenmediğini gösterir. |
| MakeReadOnly() |
Bu güvenli dizenin metin değerini salt okunur yapar. |
| MemberwiseClone() |
Geçerli Objectbasit bir kopyasını oluşturur. (Devralındığı yer: Object) |
| RemoveAt(Int32) |
Belirtilen dizin konumundaki karakteri bu güvenli dizeden kaldırır. |
| SetAt(Int32, Char) |
Belirtilen dizin konumundaki mevcut karakteri başka bir karakterle değiştirir. |
| ToString() |
Geçerli nesneyi temsil eden bir dize döndürür. (Devralındığı yer: Object) |