SecureString Classe

Definição

Representa o texto que deve ser mantido como confidencial, como excluindo-o da memória do computador quando ele não for mais necessário.Represents text that should be kept confidential, such as by deleting it from computer memory when no longer needed. Esta classe não pode ser herdada.This class cannot be inherited.

public ref class SecureString sealed : IDisposable
public sealed class SecureString : IDisposable
type SecureString = class
    interface IDisposable
Public NotInheritable Class SecureString
Implements IDisposable
Herança
SecureString
Implementações

Exemplos

O exemplo a seguir demonstra como usar um SecureString para proteger a senha de um usuário para usar como uma credencial para iniciar um novo processo.The following example demonstrates how to use a SecureString to secure a user's password for use as a credential to start a new process.

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

Comentários

Importante

Não recomendamos que você use a classe SecureString para o novo desenvolvimento.We don't recommend that you use the SecureString class for new development. Para obter mais informações, consulte SecureString não deve ser usado no github.For more information, see SecureString shouldn't be used on GitHub.

SecureString é um tipo de cadeia de caracteres que fornece uma medida de segurança.SecureString is a string type that provides a measure of security. Ele tenta evitar armazenar cadeias de caracteres potencialmente confidenciais na memória do processo como texto sem formatação.It tries to avoid storing potentially sensitive strings in process memory as plain text. (Para obter limitações, no entanto, consulte a seção como a segurança é SecureString? ) O valor de uma instância do SecureString é automaticamente protegido usando um mecanismo com suporte da plataforma subjacente quando a instância é inicializada ou quando o valor é modificado.(For limitations, however, see the How secure is SecureString? section.) The value of an instance of SecureString is automatically protected using a mechanism supported by the underlying platform when the instance is initialized or when the value is modified. Seu aplicativo pode renderizar a instância imutável e impedir outras modificações invocando o método MakeReadOnly.Your application can render the instance immutable and prevent further modification by invoking the MakeReadOnly method.

O comprimento máximo de uma instância de SecureString é de 65.536 caracteres.The maximum length of a SecureString instance is 65,536 characters.

Importante

Esse tipo implementa a interface IDisposable.This type implements the IDisposable interface. Quando você terminar de usar uma instância do tipo, deverá descartá-la direta ou indiretamente.When you have finished using an instance of the type, you should dispose of it either directly or indirectly. Para descartar o tipo diretamente, chame o método Dispose dele em um bloco try/catch.To dispose of the type directly, call its Dispose method in a try/catch block. Para descartá-lo indiretamente, use um constructo de linguagem como using ( em C#) ou Using (em Visual Basic).To dispose of it indirectly, use a language construct such as using (in C#) or Using (in Visual Basic). Saiba mais na seção "Como usar um objeto que implementa IDisposable" no tópico da interface IDisposable.For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic.

A classe SecureString e seus membros não são visíveis para COM.The SecureString class and its members are not visible to COM. Para obter mais informações, consulte ComVisibleAttribute.For more information, see ComVisibleAttribute.

Nesta seção:In this section:

Cadeia de caracteres versus SecureString String vs. SecureString
Operações de SecureString SecureString operations
de SecureString e interoperabilidadeSecureString and interop
Quão segura é a SecureString?How secure is SecureString?

Cadeia de caracteres versus SecureStringString versus SecureString

Uma instância da classe System.String é imutável e, quando não é mais necessária, não pode ser agendada por programação para a coleta de lixo; ou seja, a instância é somente leitura após ser criada, e não é possível prever quando a instância será excluída da memória do computador.An instance of the System.String class is both immutable and, when no longer needed, cannot be programmatically scheduled for garbage collection; that is, the instance is read-only after it is created, and it is not possible to predict when the instance will be deleted from computer memory. Como instâncias de System.String são imutáveis, as operações que parecem modificar uma instância existente realmente criam uma cópia dela para manipular.Because System.String instances are immutable, operations that appear to modify an existing instance actually create a copy of it to manipulate. Consequentemente, se um objeto de String contiver informações confidenciais, como uma senha, um número de cartão de crédito ou dados pessoais, haverá risco de que as informações possam ser reveladas depois que ele for usado porque seu aplicativo não poderá excluir os dados da memória do computador.Consequently, if a String object contains sensitive information such as a password, credit card number, or personal data, there is a risk the information could be revealed after it is used because your application cannot delete the data from computer memory.

Um objeto SecureString é semelhante a um objeto String, pois ele tem um valor de texto.A SecureString object is similar to a String object in that it has a text value. No entanto, o valor de um objeto SecureString é fixado na memória, podendo usar um mecanismo de proteção, como criptografia, fornecido pelo sistema operacional subjacente, pode ser modificado até que seu aplicativo o marque como somente leitura e pode ser excluído da memória do computador pelo aplicativo que chama o método Dispose ou pelo coletor de lixo .NET Framework.However, the value of a SecureString object is pinned in memory, may use a protection mechanism, such as encryption, provided by the underlying operating system, can be modified until your application marks it as read-only, and can be deleted from computer memory either by your application calling the Dispose method or by the .NET Framework garbage collector.

Para obter uma discussão sobre as limitações da classe SecureString, consulte a seção como a segurança é SecureString? .For a discussion of the limitations of the SecureString class, see the How secure is SecureString? section.

Voltar ao inícioBack to top

Operações de SecureStringSecureString operations

A classe SecureString inclui membros que permitem que você faça o seguinte:The SecureString class includes members that allow you to do the following:

Criar uma instância de um objeto SecureStringInstantiate a SecureString object
Você cria uma instância de um objeto SecureString chamando seu construtor sem parâmetros.You instantiate a SecureString object by calling its parameterless constructor.

Adicionar caracteres a um objeto SecureStringAdd characters to a SecureString object
Você pode adicionar um único caractere de cada vez a um objeto SecureString chamando seu AppendChar ou InsertAt método.You can add a single character at a time to a SecureString object by calling its AppendChar or InsertAt method.

Importante

Um objeto SecureString nunca deve ser construído a partir de uma String, porque os dados confidenciais já estão sujeitos às consequências de persistência de memória da classe String imutável.A SecureString object should never be constructed from a String, because the sensitive data is already subject to the memory persistence consequences of the immutable String class. A melhor maneira de construir um objeto de SecureString é de uma fonte não gerenciada de caractere por vez, como o método Console.ReadKey.The best way to construct a SecureString object is from a character-at-a-time unmanaged source, such as the Console.ReadKey method.

Remover caracteres de um objeto SecureStringRemove characters from a SecureString object
Você pode substituir um caractere individual chamando o método SetAt, remover um caractere individual chamando o método RemoveAt ou remover todos os caracteres da instância SecureString chamando o método Clear.You can replace an individual character by calling the SetAt method, remove an individual character by calling the RemoveAt method, or remove all characters from the SecureString instance by calling the Clear method.

Tornar o objeto de SecureString somente leituraMake the SecureString object read-only
Depois de definir a cadeia de caracteres que o objeto SecureString representa, você chama seu método MakeReadOnly para tornar a cadeia de caracteres somente leitura.Once you have defined the string that the SecureString object represents, you call its MakeReadOnly method to make the string read-only.

Obter informações sobre o objeto de SecureStringGet information about the SecureString object
A classe SecureString tem apenas dois membros que fornecem informações sobre a cadeia de caracteres: sua propriedade Length, que indica o número de unidades de código codificadas em UTF16 na cadeia de caracteres; e o método IsReadOnly, que indica se a instância é somente leitura.The SecureString class has only two members that provide information about the string: its Length property, which indicates the number of UTF16-encoded code units in the string; and the IsReadOnly, method, which indicates whether the instance is read-only.

Liberar a memória alocada para a instância de SecureStringRelease the memory allocated to the SecureString instance
Como SecureString implementa a interface IDisposable, você libera sua memória chamando o método Dispose.Because SecureString implements the IDisposable interface, you release its memory by calling the Dispose method.

A classe SecureString não tem membros que inspecionem, comparem ou convertam o valor de um SecureString.The SecureString class has no members that inspect, compare, or convert the value of a SecureString. A ausência de tais membros ajuda a proteger o valor da instância contra exposição acidental ou mal-intencionada.The absence of such members helps protect the value of the instance from accidental or malicious exposure. Use os membros apropriados da classe System.Runtime.InteropServices.Marshal, como o método SecureStringToBSTR, para manipular o valor de um objeto SecureString.Use appropriate members of the System.Runtime.InteropServices.Marshal class, such as the SecureStringToBSTR method, to manipulate the value of a SecureString object.

A biblioteca de classes de .NET Framework normalmente usa SecureString instâncias das seguintes maneiras:The .NET Framework Class Library commonly uses SecureString instances in the following ways:

Voltar ao inícioBack to top

SecureString e interoperabilidadeSecureString and interop

Como o sistema operacional não dá suporte direto a SecureString, você deve converter o valor do objeto SecureString para o tipo de cadeia de caracteres necessário antes de passar a cadeia de caracteres para um método nativo.Because the operating system does not directly support SecureString, you must convert the value of the SecureString object to the required string type before passing the string to a native method. A classe Marshal tem cinco métodos que fazem isso:The Marshal class has five methods that do this:

Cada um desses métodos cria uma cadeia de caracteres de texto não gerenciado na memória não gerenciada.Each of these methods creates a clear-text string in unmanaged memory. É responsabilidade do desenvolvedor zerar e liberar essa memória assim que ela não for mais necessária.It is the responsibility of the developer to zero out and free that memory as soon as it is no longer needed. Cada um dos métodos de conversão de cadeia de caracteres e de alocação de memória tem um método correspondente para zerar e liberar a memória alocada:Each of the string conversion and memory allocation methods has a corresponding method to zero out and free the allocated memory:

Método de alocação e conversãoAllocation and conversion method Zero e método gratuitoZero and free method
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeGlobalAllocUnicode

Voltar ao inícioBack to top

Quão segura é a SecureString?How secure is SecureString?

Quando criado corretamente, uma instância de SecureString fornece mais proteção de dados do que uma String.When created properly, a SecureString instance provides more data protection than a String. Ao criar uma cadeia de caracteres de uma fonte de caractere por vez, String cria vários intermediários na memória, enquanto SecureString cria apenas uma única instância.When creating a string from a character-at-a-time source, String creates multiple intermediate in memory, whereas SecureString creates just a single instance. A coleta de lixo de objetos de String é não determinística.Garbage collection of String objects is non-deterministic. Além disso, como sua memória não está fixada, o coletor de lixo fará cópias adicionais de String valores ao mover e compactar a memória.In addition, because its memory is not pinned, the garbage collector will make additional copies of String values when moving and compacting memory. Por outro lado, a memória alocada para um objeto SecureString é fixada e essa memória pode ser liberada chamando o método Dispose.In contrast, the memory allocated to a SecureString object is pinned, and that memory can be freed by calling the Dispose method.

Embora os dados armazenados em uma instância de SecureString sejam mais seguros do que os dados armazenados em uma instância do String, há limitações significativas em relação à segurança de uma instância SecureString.Although data stored in a SecureString instance is more secure than data stored in a String instance, there are significant limitations on how secure a SecureString instance is. Elas incluem:These include:

PlatformPlatform
No sistema operacional Windows, o conteúdo de uma matriz de caracteres interna de SecureString instância é criptografado.On the Windows operating system, the contents of a SecureString instance's internal character array are encrypted. No entanto, independentemente de as APIs ou problemas de gerenciamento de chaves ausentes, a criptografia não está disponível em todas as plataformas.However, whether because of missing APIs or key management issues, encryption is not available on all platforms. Devido a essa dependência de plataforma, SecureString não criptografa o armazenamento interno em uma plataforma não Windows.Because of this platform dependency, SecureString does not encrypt the internal storage on non-Windows platform. Outras técnicas são usadas nessas plataformas para fornecer proteção adicional.Other techniques are used on those platforms to provide additional protection.

DurationDuration
Mesmo que a implementação de SecureString seja capaz de aproveitar a criptografia, o texto sem formatação atribuído à instância de SecureString pode ser exposto em vários momentos:Even if the SecureString implementation is able to take advantage of encryption, the plain text assigned to the SecureString instance may be exposed at various times:

  • Como o Windows não oferece uma implementação de cadeia de caracteres segura no nível do sistema operacional, o .NET Framework ainda precisa converter o valor da cadeia de caracteres segura em sua representação de texto sem formatação para usá-lo.Because Windows doesn't offer a secure string implementation at the operating system level, the .NET Framework still has to convert the secure string value to its plain text representation in order to use it.

  • Sempre que o valor da cadeia de caracteres segura é modificado por métodos como AppendChar ou RemoveAt, ele deve ser descriptografado (ou seja, convertido novamente em texto sem formatação), modificado e criptografado novamente.Whenever the value of the secure string is modified by methods such as AppendChar or RemoveAt, it must be decrypted (that is, converted back to plain text), modified, and then encrypted again.

  • Se a cadeia de caracteres segura for usada em uma chamada de interoperabilidade, ela deverá ser convertida em uma cadeia de caracteres ANSI, uma cadeia de caracteres Unicode ou uma cadeia de caracteres binária (BSTR).If the secure string is used in an interop call, it must be converted to an ANSI string, a Unicode string, or a binary string (BSTR). Para obter mais informações, consulte a seção SecureString and Interop .For more information, see the SecureString and interop section.

O intervalo de tempo para o qual o valor da instância de SecureString é exposto é meramente reduzido em comparação com a classe String.The time interval for which the SecureString instance's value is exposed is merely shortened in comparison to the String class.

Armazenamento versus usoStorage versus usage
Em geral, a classe SecureString define um mecanismo de armazenamento para valores de cadeia de caracteres que devem ser protegidos ou mantidos confidenciais.More generally, the SecureString class defines a storage mechanism for string values that should be protected or kept confidential. No entanto, fora do .NET Framework em si, nenhum mecanismo de uso oferece suporte a SecureString.However, outside of the .NET Framework itself, no usage mechanism supports SecureString. Isso significa que a cadeia de caracteres segura deve ser convertida em um formulário utilizável (normalmente um formato de texto não criptografado) que pode ser reconhecido por seu destino, e que a descriptografia e a conversão devem ocorrer no espaço do usuário.This means that the secure string must be converted to a usable form (typically a clear text form) that can be recognized by its target, and that decryption and conversion must occur in user space.

Em geral, a SecureString é mais segura do que String porque limita a exposição de dados de cadeia de caracteres confidenciais.Overall, SecureString is more secure than String because it limits the exposure of sensitive string data. No entanto, essas cadeias de caracteres ainda podem ser expostas a qualquer processo ou operação que tenha acesso à memória bruta, como um processo mal-intencionado em execução no computador host, um despejo de processo ou um arquivo de permuta visível pelo usuário.However, those strings may still be exposed to any process or operation that has access to raw memory, such as a malicious process running on the host computer, a process dump, or a user-viewable swap file. Em vez de usar SecureString para proteger senhas, a alternativa recomendada é usar um identificador opaco para as credenciais armazenadas fora do processo.Instead of using SecureString to protect passwords, the recommended alternative is to use an opaque handle to credentials that are stored outside of the process.

Voltar ao inícioBack to top

Construtores

SecureString()

Inicializa uma nova instância da classe SecureString.Initializes a new instance of the SecureString class.

SecureString(Char*, Int32)

Inicializa uma nova instância da classe SecureString de uma submatriz de objetos Char.Initializes a new instance of the SecureString class from a subarray of Char objects.

Este construtor não está em conformidade com CLS.This constructor is not CLS-compliant. A alternativa em conformidade com CLS é SecureString().The CLS-compliant alternative is SecureString().

Propriedades

Length

Obtém o número de caracteres na cadeia de caracteres atual.Gets the number of characters in the current secure string.

Métodos

AppendChar(Char)

Acrescenta um caractere ao final da cadeia de caracteres segura atual.Appends a character to the end of the current secure string.

Clear()

Exclui o valor da cadeia de caracteres segura atual.Deletes the value of the current secure string.

Copy()

Cria uma cópia da cadeia de caracteres segura atual.Creates a copy of the current secure string.

Dispose()

Libera todos os recursos usados pelo objeto SecureString atual.Releases all resources used by the current SecureString object.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.Determines whether the specified object is equal to the current object.

(Herdado de Object)
GetHashCode()

Serve como a função de hash padrão.Serves as the default hash function.

(Herdado de Object)
GetType()

Obtém o Type da instância atual.Gets the Type of the current instance.

(Herdado de Object)
InsertAt(Int32, Char)

Insere um caractere nesta cadeia de caracteres segura na posição de índice especificada.Inserts a character in this secure string at the specified index position.

IsReadOnly()

Indica se essa cadeia de caracteres segura é marcada como somente leitura.Indicates whether this secure string is marked read-only.

MakeReadOnly()

Torna o valor de texto da cadeia de caracteres segura em somente leitura.Makes the text value of this secure string read-only.

MemberwiseClone()

Cria uma cópia superficial do Object atual.Creates a shallow copy of the current Object.

(Herdado de Object)
RemoveAt(Int32)

Remove o caractere na posição de índice especificada dessa cadeia de caracteres segura.Removes the character at the specified index position from this secure string.

SetAt(Int32, Char)

Substitui o caractere existente na posição de índice especificada por outro caractere.Replaces the existing character at the specified index position with another character.

ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.Returns a string that represents the current object.

(Herdado de Object)

Aplica-se a

Veja também