Compartilhar via


Classe System.Security.SecureString

Importante

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

Este artigo fornece comentários 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 é fixado na memória, pode usar um mecanismo de proteção, como a criptografia, fornecida pelo sistema operacional subjacente, pode ser modificado até que seu aplicativo o marque como somente leitura e possa ser excluído da memória do computador, seja 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.

Duração

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 De modo mais 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.