Share via


System.Security.SecureString sınıfı

Önemli

.NET'te (Core) yeni geliştirme için veya mevcut kodu .NET'e (Core) geçirirken sınıfını kullanmamanızı SecureString öneririz. Daha fazla bilgi için bkz . SecureString kullanılmamalıdır.

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. (Ancak sınırlamalar için bkz. 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.

Örneğin uzunluğu SecureString en fazla 65.536 karakterdir.

Önemli

Bu tür arabirimini IDisposable uygular. Türün bir örneğini kullanmayı bitirdiğinizde, doğrudan veya dolaylı olarak atmalısınız. Türü doğrudan atmak için yöntemini bir try/catch blok içinde çağırın.Dispose Bunu dolaylı olarak atmak için (C#'de) veya Using (Visual Basic'te) gibi using 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 olduğundan System.String , var olan bir örneği değiştirmek için görünen işlemler aslında işlemek için bir kopyasını 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 ve uygulamanızın 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

sınıfı, SecureString aşağıdakileri yapmanıza olanak sağlayan üyeler içerir:

Nesne SecureString örneği oluşturma Parametresiz oluşturucusunu çağırarak bir SecureString nesnenin örneğini oluşturursunuz.

Nesneye SecureString karakter ekleme Veya yöntemini çağırarak AppendCharInsertAt bir nesneye aynı anda tek bir SecureString karakter ekleyebilirsiniz.

Önemli

SecureString Hassas veriler sabit sınıfın bellek kalıcılığı sonuçlarına String zaten tabi olduğundan, nesnesi hiçbir zaman öğesinden Stringoluşturulamaz. Bir nesne oluşturmanın SecureString en iyi yolu, yöntemi gibi bir karaktere sahip yönetilmeyen kaynaktandır Console.ReadKey .

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 Clear örnekteki SecureString 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.

Örneğe ayrılan belleği serbest bırakın Arabirimi SecureString uyguladığından SecureStringIDisposable, yöntemini çağırarak belleğini Dispose serbest bırakırsınız.

sınıfı, SecureString değerini inceleyen, karşılaştıran veya dönüştüren üyeye SecureStringsahip değildir. 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 SecureString nesnenin System.Runtime.InteropServices.Marshal değerini işlemek için yöntemi gibi SecureStringToBSTR sınıfın uygun üyelerini kullanın.

.NET Sınıf Kitaplığı genellikle aşağıdaki yollarla örnekleri kullanır SecureString :

SecureString ve birlikte çalışma

İş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:

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:

Ayırma ve dönüştürme yöntemi Sıfır ve ücretsiz yöntem
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

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 atık toplaması String belirleyici değildir. Ayrıca, belleği sabitlenmediğinden, çöp toplayıcı belleği taşırken ve sıkıştırırken değerlerin String 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 örnekte depolanan veriler bir SecureString örnekte depolanan verilerden daha güvenli olsa da String , örneğin ne kadar güvenli SecureString olduğuna ilişkin önemli sınırlamalar vardır. Bu modüller şunlardır:

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.

Duration

Uygulama şifrelemeden yararlanabilse SecureString bile örneğe atanan SecureString düz metin çeşitli zamanlarda gösterilebilir:

  • 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 veya RemoveAtgibi AppendChar 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.

Örneğin değerinin SecureString kullanıma sunulduğu zaman aralığı, sınıfa String göre yalnızca kısaltılır.

Depolama ve kullanım Daha genel olarakSecureString, sınıfı 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 kullanmak SecureString yerine, önerilen alternatif, işlemin dışında depolanan kimlik bilgileri için opak bir tanıtıcı kullanmaktır.