Como converter String
para SecureString
?
Como converter String
para SecureString
?
Respostas:
Você não Todo o motivo do uso do objeto SecureString é evitar a criação de um objeto de seqüência de caracteres (carregado na memória e mantido em texto sem formatação até a coleta de lixo). No entanto, você pode adicionar caracteres a um SecureString anexando-os.
var s = new SecureString();
s.AppendChar('d');
s.AppendChar('u');
s.AppendChar('m');
s.AppendChar('b');
s.AppendChar('p');
s.AppendChar('a');
s.AppendChar('s');
s.AppendChar('s');
s.AppendChar('w');
s.AppendChar('d');
*****
AppendChar
não é executado até o tempo de execução; portanto, esses caracteres ainda podem ser lidos na IL, correto? Talvez alguma ofuscação em tempo de compilação ajude também ... isto é, se você estiver codificando senhas.
Também há outra maneira de converter entre SecureString
e String
.
1. String para SecureString
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2. SecureString para String
string theString = new NetworkCredential("", theSecureString).Password;
Aqui está o link
SecureString
se seu código criar um string
objeto com o valor que você deseja proteger. O objetivo SecureString
é evitar ter a sequência na memória gerenciada, para que um invasor examine essa memória para identificar o valor que deseja ocultar. Como o NetworkCredential
construtor que você está chamando exige uma string, esse não é o caminho a percorrer ... Claro, seu código é uma maneira fácil de converter de e para um SecureString, mas usá-lo torna seu código tão seguro quanto usar um simplesstring
SecureString
quando estiver trabalhando com algumas bibliotecas. E vamos ser honestos aqui, se alguém estiver examinando ativamente a memória do seu aplicativo, então você já perdeu. Mesmo se você tiver usado o SecureString corretamente, o que nunca vi, haverá outros dados valiosos para extrair.
O método abaixo ajuda a converter a string em uma string segura
private SecureString ConvertToSecureString(string password)
{
if (password == null)
throw new ArgumentNullException("password");
var securePassword = new SecureString();
foreach (char c in password)
securePassword.AppendChar(c);
securePassword.MakeReadOnly();
return securePassword;
}
Aqui está um truque barato de linq.
SecureString sec = new SecureString();
string pwd = "abc123"; /* Not Secure! */
pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
/* and now : seal the deal */
sec.MakeReadOnly();
Vou jogar isso lá fora. Por quê?
Você não pode simplesmente alterar todas as suas strings para protegê-las e, de repente, seu aplicativo é "seguro". A cadeia segura foi projetada para manter a cadeia criptografada pelo maior tempo possível e somente descriptografada por um período muito curto, limpando a memória após a execução de uma operação nela.
Eu arriscaria dizer que você pode ter alguns problemas no nível de design antes de se preocupar em proteger as seqüências de caracteres do aplicativo. Dê-nos mais algumas informações sobre o que você está tentando fazer e podemos ajudar melhor.
sem linq chique, sem adicionar todos os caracteres à mão, pura e simplesmente:
var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);
var sc = new SecureString(); foreach(char c in "foo") sc.appendChar(c);
Eu só quero salientar a todo o povo dizendo: "Isso não é o ponto de SecureString
", que muitas das pessoas fazendo esta pergunta pode estar em uma aplicação onde, por qualquer motivo, justificado ou não, eles são não particularmente preocupado sobre ter uma cópia temporária da senha fica na pilha como uma sequência capaz de GC, mas eles precisam usar uma API que aceite apenasSecureString
objetos. Então, você tem um aplicativo em que não se importa se a senha está no heap, talvez seja apenas para uso interno e a senha só esteja lá porque é necessária pelos protocolos de rede subjacentes e você descobre que a sequência em que a senha está armazenada não pode ser usada para, por exemplo, configurar um PowerShell Runspace remoto - mas não há uma linha única fácil e direta para criar essaSecureString
isto que você precisa. É um pequeno inconveniente - mas provavelmente vale a pena para garantir que as aplicações que realmente fazer precisa SecureString
não tempt os autores ao uso System.String
ou System.Char[]
intermediários. :-)
Se você deseja compactar a conversão de a string
em a SecureString
em uma LINQ
instrução, pode expressá-la da seguinte maneira:
var plain = "The quick brown fox jumps over the lazy dog";
var secure = plain
.ToCharArray()
.Aggregate( new SecureString()
, (s, c) => { s.AppendChar(c); return s; }
, (s) => { s.MakeReadOnly(); return s; }
);
No entanto, lembre-se de que o uso LINQ
não melhora a segurança desta solução. Ele sofre da mesma falha que qualquer conversão de string
para SecureString
. Enquanto o original string
permanecer na memória, os dados estarão vulneráveis.
Dito isto, o que a declaração acima pode oferecer é manter junto a criação do SecureString
, sua inicialização com os dados e, finalmente, impedi-lo de modificar.
As 2 extensões a seguir devem fazer o truque:
Para uma char
matriz
public static SecureString ToSecureString(this char[] _self)
{
SecureString knox = new SecureString();
foreach (char c in _self)
{
knox.AppendChar(c);
}
return knox;
}
E para string
public static SecureString ToSecureString(this string _self)
{
SecureString knox = new SecureString();
char[] chars = _self.ToCharArray();
foreach (char c in chars)
{
knox.AppendChar(c);
}
return knox;
}
Obrigado a John Dagg pela AppendChar
recomendação.
você pode usar esse script simples
private SecureString SecureStringConverter(string pass)
{
SecureString ret = new SecureString();
foreach (char chr in pass.ToCharArray())
ret.AppendChar(chr);
return ret;
}
12345
... esse é o tipo de coisa que um idiota tem na bagagem!"