Compartilhar via


System.Security.SecureString classe

Importante

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

Este artigo fornece observações complementares à documentação de referência para essa 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 confidenciais na memória de processo como texto sem formatação. (Para limitações, no entanto, consulte o Quão seguro é o SecureString? seção.) 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 modificações adicionais invocando o MakeReadOnly método.

O comprimento máximo de uma SecureString ocorrência é de 65.536 caracteres.

Importante

Esse tipo implementa a interface IDisposable. Quando terminar de usar uma instância do tipo, você deve 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 (em Visual Basic). Saiba mais na seção "Como usar um objeto que implementa IDisposable" no tópico da interface IDisposable.

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

String versus SecureString

Uma instância da classe é imutável e, quando não é mais necessária, não pode ser programaticamente agendada 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 System.String memória do computador. Como System.String as instâncias são imutáveis, as operações que parecem modificar uma instância existente na verdade criam uma cópia dela para manipulá-la. Consequentemente, se um String objeto contiver informações confidenciais, como senha, número de cartão de crédito ou dados pessoais, há o risco de que as informações possam ser reveladas depois de serem usadas, pois seu aplicativo não pode excluir os dados da memória do computador.

Um SecureString objeto é semelhante a um objeto na medida em que ele tem um String valor de texto. No entanto, o valor de um objeto é fixado na memória, pode usar um SecureString mecanismo de proteção, como criptografia, fornecido pelo sistema operacional subjacente, pode ser modificado até que seu aplicativo marcá-lo como somente leitura e pode ser excluído da memória do computador pelo aplicativo chamando o Dispose método ou pelo coletor de lixo .NET.

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

Operações do SecureString

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

Instanciar um objeto Você instancia um SecureStringSecureString objeto chamando seu construtor sem parâmetros.

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

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 fonte não gerenciada de caractere de cada vez, como o Console.ReadKey método.

Remover caracteres de um objeto Você pode substituir um caractere individual chamando o método, remover um SecureString caractere individual chamando o método ou remover todos os caracteres da SecureString ocorrência chamando o SetAtRemoveAtClear método.

Tornar o objeto somente leitura Depois de definir a cadeia de caracteres que o SecureStringSecureString objeto representa, você chama seu MakeReadOnly método para tornar a cadeia de caracteres somente leitura.

Obter informações sobre o objeto A SecureString classe tem apenas dois membros que fornecem informações sobre a cadeia de caracteres: sua Length propriedade, que indica o número de unidades de código codificadas em UTF16 na cadeia de caracteres; e o SecureStringIsReadOnlymétodo , que indica se a instância é somente leitura.

Liberar a memória alocada para a instância Como SecureString implementa a SecureStringIDisposable 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 SecureStringarquivo . A ausência desses membros ajuda a proteger o valor da instância contra exposição acidental ou maliciosa. Use membros apropriados da System.Runtime.InteropServices.Marshal classe, como o método, para manipular o SecureStringToBSTR valor de um SecureString objeto.

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

SecureString e interoperabilidade

Como o sistema operacional não oferece suporte SecureStringdiretamente ao , você deve converter o valor do objeto para o tipo de cadeia de caracteres necessário antes de passar a cadeia de SecureString 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 não criptografado 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 atribuição e conversão Método zero e livre
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

Quão seguro é o SecureString?

Quando criada corretamente, uma SecureString instância fornece mais proteção de dados do que um Stringarquivo . Ao criar uma cadeia de caracteres a partir de uma fonte de caractere por vez, cria vários intermediários na memória, String enquanto SecureString cria apenas uma única instância. A coleta de lixo de String objetos não é determinística. 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. 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 instância sejam mais seguros do que os dados armazenados em uma instância, há limitações significativas sobre a segurança de uma SecureStringStringSecureString instância. Estão incluídos:

Plataforma

No sistema operacional Windows, o conteúdo da matriz de caracteres interna de uma SecureString instância é criptografado. No entanto, seja devido à falta de APIs ou a 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 em plataforma não-Windows. Outras técnicas são usadas nessas plataformas para fornecer proteção adicional.

Duration

Mesmo que a SecureString implementação seja capaz de tirar proveito da criptografia, o texto sem formatação atribuído à SecureString instância pode 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á-la.

  • Sempre que o valor da cadeia de caracteres segura for modificado por métodos como AppendChar ou , ele deverá ser descriptografado (ou RemoveAtseja, convertido de volta para 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 para o qual o SecureString valor da instância é exposto é meramente encurtado em comparação com a String classe.

Armazenamento versus uso Mais geralmente, 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, nenhum mecanismo de uso oferece suporte ao SecureString. Isso significa que a cadeia de caracteres segura deve ser convertida em um formulário utilizável (normalmente um formulário de texto não criptografado) que possa ser reconhecido por seu destino, e que a descriptografia e a 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 de 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 permuta visível pelo usuário. Em vez de usar para proteger senhas, a alternativa recomendada é usar SecureString um identificador opaco para credenciais armazenadas fora do processo.