SecureString Classe

Definição

Representa o texto que deve ser mantido confidencial, por exemplo, excluindo-o da memória do computador quando não for mais necessário. Essa classe não pode ser herdada.

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 uma SecureString senha para proteger a senha de um usuário para uso como uma credencial para iniciar um novo processo.

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

Recomendamos que você não use a SecureString classe para o novo desenvolvimento no .NET (Core) ou ao migrar do .NET Framework. Para obter mais informações, consulte SecureString não deve ser usado.

Note

Este artigo fornece observações complementares à documentação de referência para esta API.

SecureString é um tipo de cadeia de caracteres que fornece uma medida de segurança. Ele tenta evitar o armazenamento de cadeias de caracteres potencialmente sensíveis na memória do processo como texto sem formatação. (Para limitações, no entanto, consulte a seção Quão seguro é SecureString?) O valor de uma instância de SecureString é protegido automaticamente usando um mecanismo suportado pela plataforma subjacente quando a instância é inicializada ou quando o valor é modificado. Seu aplicativo pode tornar a instância imutável e impedir uma modificação adicional invocando o MakeReadOnly método.

O comprimento máximo de uma SecureString instância é de 65.536 caracteres.

Importante

Esse tipo implementa a IDisposable interface. Quando terminar de usar uma instância do tipo, você deverá descartá-la direta ou indiretamente. Para descartar o tipo diretamente, chame o método Dispose dele em um bloco try/catch. Para descartá-lo indiretamente, use um constructo de linguagem como using (em C#) ou Using (no Visual Basic). Para obter mais informações, consulte a seção "Usando um objeto que implementa idisposable" no tópico da IDisposable interface.

A SecureString classe e seus membros não estão visíveis para COM. Para obter mais informações, consulte ComVisibleAttribute.

Cadeia de caracteres versus SecureString

Uma instância da System.String classe é imutável e, quando não é mais necessária, não pode ser agendada programaticamente para coleta de lixo; ou seja, a instância é somente leitura depois de criada e não é possível prever quando a instância será excluída da memória do computador. Como System.String as instâncias são imutáveis, as operações que parecem modificar uma instância existente realmente criam uma cópia dela para manipular. Consequentemente, se um String objeto contiver informações confidenciais, como uma senha, um número de cartão de crédito ou dados pessoais, haverá um risco de que as informações possam ser reveladas depois que forem usadas porque seu aplicativo não pode excluir os dados da memória do computador.

Um SecureString objeto é semelhante a um String objeto no qual ele tem um valor de texto. No entanto, o valor de um SecureString objeto:

  • Está fixado na memória.
  • Pode 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.
  • Pode ser excluído da memória do computador pelo aplicativo que chama o Dispose método ou pelo coletor de lixo .NET.

Para uma discussão sobre as limitações da SecureString classe, consulte a seção Quão seguro é SecureString?

Operações secureString

A SecureString classe inclui membros que permitem que você faça o seguinte:

Instanciar um SecureString objeto Você cria uma instância de um SecureString objeto chamando seu construtor sem parâmetros.

Adicionar caracteres a um SecureString objeto Você pode adicionar um único caractere de cada vez a um SecureString objeto chamando seu AppendChar método ou InsertAt método.

Importante

Um SecureString objeto nunca deve ser construído a partir de um String, porque os dados confidenciais já estão sujeitos às consequências de persistência de memória da classe imutável String . A melhor maneira de construir um SecureString objeto é a partir de uma origem não gerenciada que processa um caractere por vez, como o método Console.ReadKey.

Remover caracteres de um SecureString objeto Você pode substituir um caractere individual chamando o SetAt método, remover um caractere individual chamando o RemoveAt método ou remover todos os caracteres da SecureString instância chamando o Clear método.

Torne o objeto SecureString somente leitura. Depois de definir a cadeia de caracteres que o objeto SecureString representa, você deve chamar o método MakeReadOnly para tornar a cadeia de caracteres somente leitura.

Obtenha informações sobre o objeto SecureString A classe SecureString tem apenas dois membros que oferecem informações sobre a string: sua propriedade Length, que indica o número de unidades de código codificadas em UTF-16; e o método IsReadOnly, que indica se a instância é somente leitura.

Liberar a memória alocada para a SecureString instância Porque SecureString implementa a IDisposable interface, você libera sua memória chamando o Dispose método.

A SecureString classe não tem membros que inspecionem, comparem ou convertam o valor de um SecureString. A ausência desses membros ajuda a proteger o valor da instância contra exposição acidental ou mal-intencionada. Use membros apropriados da System.Runtime.InteropServices.Marshal classe, como o SecureStringToBSTR método, para manipular o valor de um SecureString objeto.

A Biblioteca de Classes do .NET geralmente usa instâncias de SecureString das seguintes maneiras:

SecureString e interoperabilidade

Como o sistema operacional não dá suporte SecureStringdiretamente, você deve converter o valor do objeto no tipo de SecureString cadeia de caracteres necessário antes de passar a cadeia de caracteres para um método nativo. A Marshal classe tem cinco métodos que fazem isso:

Cada um desses métodos cria uma cadeia de caracteres de texto claro na memória não gerenciada. É responsabilidade do desenvolvedor zerar e liberar essa memória assim que ela não for mais necessária. Cada um dos métodos de conversão de cadeia de caracteres e alocação de memória tem um método correspondente para zerar e liberar a memória alocada.

Método de alocação e conversão Método zero e gratuito
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

Qual é a segurança do SecureString?

Quando criada corretamente, uma SecureString instância fornece mais proteção de dados do que uma String. Ao criar uma cadeia de caracteres a partir de uma fonte de um caractere por vez, String cria vários intermediários na memória, enquanto SecureString cria apenas uma única instância. A coleta de lixo de objetos String não é determinística. Além disso, como sua memória não está fixada, o coletor de lixo fará cópias adicionais de valores String ao mover e compactar a memória. Por outro lado, a memória alocada a um SecureString objeto é fixada e essa memória pode ser liberada chamando o Dispose método.

Embora os dados armazenados em uma SecureString instância sejam mais seguros do que os dados armazenados em uma String instância, há limitações significativas sobre a segurança de uma SecureString instância. Elas incluem:

  • Plataforma

    No sistema operacional Windows, o conteúdo da matriz de caracteres interno de uma SecureString instância é criptografado. No entanto, seja devido a APIs ausentes ou problemas de gerenciamento de chaves, a criptografia não está disponível em todas as plataformas. Devido a essa dependência de plataforma, SecureString não criptografa o armazenamento interno na plataforma que não é do Windows. Outras técnicas são usadas nessas plataformas para fornecer proteção adicional.

  • Duration

    Mesmo que a SecureString implementação seja capaz de aproveitar a criptografia, o texto sem formatação atribuído à SecureString instância poderá ser exposto em vários momentos:

    • Como o Windows não oferece uma implementação de cadeia de caracteres segura no nível do sistema operacional, o .NET ainda precisa converter o valor da cadeia de caracteres segura em sua representação de texto sem formatação para usá-lo.
    • Sempre que o valor da cadeia de caracteres segura é modificado por métodos como AppendChar ou RemoveAt, ele deve ser descriptografado (ou seja, convertido de volta em texto sem formatação), modificado e criptografado novamente.
    • 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). Para obter mais informações, consulte a seção SecureString e interoperabilidade .

    O intervalo de tempo em que o valor da instância SecureString é exposto é simplesmente reduzido em comparação à classe String.

  • Armazenamento versus uso

    Em geral, a SecureString classe define um mecanismo de armazenamento para valores de cadeia de caracteres que devem ser protegidos ou mantidos confidenciais. No entanto, fora do próprio .NET, não há mecanismo de uso que ofereça suporte a SecureString. Isso significa que a cadeia de caracteres segura deve ser convertida em um formulário utilizável (normalmente um formulário de texto claro) que pode ser reconhecido por seu destino e que a descriptografia e conversão devem ocorrer no espaço do usuário.

No geral, SecureString é mais seguro do que String porque limita a exposição de dados confidenciais da cadeia de caracteres. 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 troca acessível pelo usuário. Em vez de usar SecureString para proteger senhas, a alternativa recomendada é usar um identificador opaco para credenciais armazenadas fora do processo.

Construtores

Nome Description
SecureString()

Inicializa uma nova instância da classe SecureString.

SecureString(Char*, Int32)

Inicializa uma nova instância da classe de SecureString uma subarray de Char objetos.

Esse construtor não é compatível com CLS. A alternativa compatível com CLS é SecureString().

Propriedades

Nome Description
Length

Obtém o número de caracteres na cadeia de caracteres segura atual.

Métodos

Nome Description
AppendChar(Char)

Acrescenta um caractere ao final da cadeia de caracteres segura atual.

Clear()

Exclui o valor da cadeia de caracteres segura atual.

Copy()

Cria uma cópia da cadeia de caracteres segura atual.

Dispose()

Libera todos os recursos usados pelo objeto atual SecureString .

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetHashCode()

Serve como a função de hash padrão.

(Herdado de Object)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
InsertAt(Int32, Char)

Insere um caractere nessa cadeia de caracteres segura na posição de índice especificada.

IsReadOnly()

Indica se essa cadeia de caracteres segura está marcada como somente leitura.

MakeReadOnly()

Torna o valor de texto dessa cadeia de caracteres segura somente leitura.

MemberwiseClone()

Cria uma cópia superficial do Objectatual.

(Herdado de Object)
RemoveAt(Int32)

Remove o caractere na posição de índice especificada dessa cadeia de caracteres segura.

SetAt(Int32, Char)

Substitui o caractere existente na posição de índice especificada por outro caractere.

ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

(Herdado de Object)

Aplica-se a

Confira também