Aracılığıyla paylaş


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. (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.

Önemli

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 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

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.

Önemli

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. 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 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:

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:

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 çö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:

Platforma

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 Daha genel olarak, SecureString 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 SecureString kullanmak yerine, önerilen alternatif, işlem dışında depolanan kimlik bilgileri için şeffaf olmayan bir tanıtıcı kullanmaktır.