SecureString Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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. 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 um para proteger a senha de um usuário para uso como uma SecureString 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
Não recomendamos que você use a classe SecureString
para novo desenvolvimento. Para obter mais informações, consulte SecureString não deve ser usado em GitHub.
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 do processo como texto sem-texto. (Para limitações, no entanto, consulte a seção Quão seguro é SecureString?. O valor de uma instância do é protegido automaticamente usando um mecanismo com suporte pela plataforma subjacente quando a instância é inicializada ou quando o SecureString valor é modificado. Seu aplicativo pode renderizar a instância imutável e impedir modificações posteriores invocando o MakeReadOnly método .
O comprimento máximo de uma SecureString instância é de 65.536 caracteres.
Importante
Esse tipo implementa a interface IDisposable. Quando terminar de usar uma instância do tipo, você deverá descartar essa instância 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.
Nesta seção:
String vs. SecureString
Operações SecureString
SecureString e interop
Quão seguro é SecureString?
String versus SecureString
Uma instância da 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 System.String 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 objeto contiver informações confidenciais, como senha, número de cartão de crédito ou dados pessoais, haverá um risco de que as informações sejam reveladas depois que elas são usadas porque seu aplicativo não pode excluir os dados da memória do String computador.
Um SecureString objeto é semelhante a um objeto em que ele tem um valor de String texto. No entanto, o valor de um objeto é 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 marca como somente leitura e pode ser excluído da memória do computador por seu aplicativo chamando o método ou pelo coletor de SecureString Dispose lixo .NET Framework.
Para obter uma discussão sobre as limitações da classe, consulte a SecureString seção Quão seguro é SecureString?.
Operações SecureString
A SecureString classe inclui membros que permitem que você faça o seguinte:
Insinuar um SecureString objeto
Insinue 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 método ou AppendChar InsertAt .
Importante
Um objeto nunca deve ser construído de um , porque os dados confidenciais já estão sujeitos às consequências de persistência de memória da SecureString String classe String imutável. A melhor maneira de construir um objeto é de uma fonte de caractere por vez SecureString nãomano, como o Console.ReadKey método .
Remover caracteres de um SecureString objeto
Você pode substituir um caractere individual chamando o método , remover um caractere individual chamando o método ou remover todos os caracteres da instância chamando SetAt RemoveAt o método SecureString Clear .
Tornar o SecureString objeto somente leitura
Depois de definir a cadeia de caracteres que o objeto representa, chame seu método para tornar a cadeia SecureString MakeReadOnly de caracteres somente leitura.
Obter informações sobre o SecureString objeto
A classe tem apenas dois membros que fornecem informações sobre a cadeia de caracteres: sua propriedade, que indica o número de unidades de código codificadas em UTF16 na cadeia de caracteres; e o método , que indica se a instância é somente SecureString Length IsReadOnly leitura.
Liberar a memória alocada para a SecureString instância
Como SecureString implementa a interface , você libera sua memória chamando o método IDisposable Dispose .
A SecureString classe não tem membros que inspecionam, comparam ou convertem 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 System.Runtime.InteropServices.Marshal da classe , como o método , para manipular o valor de um objeto SecureStringToBSTR SecureString .
A .NET Framework biblioteca de classes do .NET Framework normalmente SecureString usa instâncias das seguintes maneiras:
Para fornecer informações de senha a um processo usando a estrutura ou chamando uma sobrecarga do método que ProcessStartInfo tem um parâmetro do tipo Process.Start SecureString .
Para fornecer informações de senha de rede chamando um construtor de classe que NetworkCredential tem um parâmetro do tipo ou usando a propriedade SecureString NetworkCredential.SecurePassword .
Para fornecer informações de senha SQL Server Autenticação chamando o construtor ou recuperando SqlCredential.SqlCredential o valor da SqlCredential.Password propriedade.
Para passar uma cadeia de caracteres para código nãomanagedo. Para obter mais informações, consulte a seção SecureString e interop.
SecureString e interop
Como o sistema operacional não dá suporte diretamente a , você deve converter o valor do objeto no tipo de cadeia de caracteres necessário antes de passar a cadeia de caracteres SecureString SecureString para um método nativo. A Marshal classe tem cinco métodos que fazem isso:
Marshal.SecureStringToBSTR, que converte o valor da cadeia de caracteres em uma cadeia de caracteres SecureString binária (BSTR) reconhecida por COM.
Marshal.SecureStringToCoTaskMemAnsi e Marshal.SecureStringToGlobalAllocAnsi , que copiam o valor da cadeia de SecureString caracteres para uma cadeia de caracteres ANSI na memória nãomanuada.
Marshal.SecureStringToCoTaskMemUnicode e Marshal.SecureStringToGlobalAllocUnicode , que copiam o valor da cadeia SecureString de caracteres para uma cadeia de caracteres Unicode na memória nãomanageda.
Cada um desses métodos cria uma cadeia de caracteres de texto não limpo na memória nãomanageda. É 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:
Quão seguro é SecureString?
Quando criada corretamente, uma SecureString instância fornece mais proteção de dados do que um String . Ao criar uma cadeia de caracteres de uma origem de caractere por vez, o cria vários intermediários na memória, enquanto String cria apenas uma única SecureString instância. A coleta de String lixo de 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 valores ao mover String e compactar a memória. Por outro lado, a memória alocada para um objeto é fixada e essa memória pode SecureString ser liberada chamando o método Dispose .
Embora os dados armazenados em uma instância sejam mais seguros do que os dados armazenados em uma instância do , há limitações significativas em relação à segurança SecureString String de uma SecureString instância. Elas incluem:
Plataforma
No Windows sistema operacional, o conteúdo da matriz de caracteres interna de uma instância SecureString é criptografado. No entanto, seja devido a problemas de gerenciamento de chaves ou APIs ausentes, a criptografia não está disponível em todas as plataformas. Devido a essa dependência de plataforma, SecureString o não criptografa o armazenamento interno em uma plataforma Windows não criptografada. Outras técnicas são usadas nessas plataformas para fornecer proteção adicional.
Duração
Mesmo se a implementação for capaz de aproveitar a criptografia, o texto sem-texto atribuído à instância poderá SecureString ser exposto em vários SecureString momentos:
Como 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-formato para usá-lo.
Sempre que o valor da cadeia de caracteres segura é modificado por métodos como ou , ele deve ser descriptografado (ou seja, convertido de volta em texto sem-texto), modificado e criptografado AppendChar RemoveAt novamente.
Se a cadeia de caracteres segura for usada em uma chamada de interop, 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 interop.
O intervalo de tempo para o qual o valor da instância é exposto SecureString é simplesmente abreviado em comparação com a classe String .
Armazenamento versus uso
Em geral, a classe define um mecanismo de armazenamento para valores de cadeia SecureString de caracteres que devem ser protegidos ou mantidos confidenciais. No entanto, fora do próprio .NET Framework, nenhum mecanismo de uso dá suporte a SecureString . Isso significa que a cadeia de caracteres segura deve ser convertida em um formulário acessível (normalmente um formulário 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.
Em geral, é mais seguro do que porque limita a exposição de dados confidenciais SecureString String 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 que pode ser visualizado pelo usuário. Em vez de usar para proteger senhas, a alternativa recomendada é usar um alçamento opaco para credenciais SecureString armazenadas fora do processo.
Construtores
SecureString() |
Inicializa uma nova instância da classe SecureString. |
SecureString(Char*, Int32) |
Inicializa uma nova instância da classe SecureString de uma submatriz de objetos Char. Este construtor não é compatível com CLS. A alternativa compatível com CLS é SecureString(). |
Propriedades
Length |
Obtém o número de caracteres na cadeia de caracteres atual. |
Métodos
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 SecureString atual. |
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 nesta cadeia de caracteres segura na posição de índice especificada. |
IsReadOnly() |
Indica se essa cadeia de caracteres segura é marcada como somente leitura. |
MakeReadOnly() |
Torna o valor de texto da cadeia de caracteres segura em somente leitura. |
MemberwiseClone() |
Cria uma cópia superficial do Object atual. (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) |