SecureString Sınıf

Tanım

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:

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:

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

Şunlara uygulanır

Ayrıca bkz.