Come convertire String
in SecureString
?
Come convertire String
in SecureString
?
Risposte:
Non lo fai. L'intera ragione per utilizzare l'oggetto SecureString è evitare di creare un oggetto stringa (che viene caricato in memoria e conservato in testo normale fino alla raccolta dei rifiuti). Tuttavia, puoi aggiungere caratteri a SecureString aggiungendoli.
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
non viene eseguito fino al runtime, quindi quei caratteri possono ancora essere letti dall'IL, giusto? Forse anche un po 'di offuscamento in fase di compilazione potrebbe aiutare ... cioè, se stai codificando le password.
C'è anche un altro modo per convertire tra SecureString
eString
.
1. String a SecureString
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2. SecureString a String
string theString = new NetworkCredential("", theSecureString).Password;
Ecco il link
SecureString
se il codice crea un string
oggetto con il valore che si desidera proteggere. L'obiettivo di SecureString
è evitare di avere la stringa nella memoria gestita, in modo che un utente malintenzionato che esamina quella memoria possa individuare il valore che si desidera nascondere. Poiché il NetworkCredential
costruttore che stai chiamando richiede una stringa, non è questa la strada da percorrere ... Certo, il tuo codice è un modo semplice per convertire da e verso una SecureString, ma usarlo rende il tuo codice sicuro come usare un semplicestring
SecureString
quando lavoriamo con alcune librerie. E siamo onesti qui, se qualcuno sta attivamente scansionando la memoria della tua applicazione, allora hai già perso. Anche se hai usato SecureString correttamente, cosa che non ho mai visto, ci saranno altri dati preziosi da estrarre.
sotto il metodo aiuta a convertire la stringa in stringa sicura
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;
}
Ecco un trucco linq economico.
SecureString sec = new SecureString();
string pwd = "abc123"; /* Not Secure! */
pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
/* and now : seal the deal */
sec.MakeReadOnly();
Lo butto là fuori. Perché?
Non puoi semplicemente cambiare tutte le tue stringhe in stringhe protette e improvvisamente la tua applicazione è "sicura". La stringa sicura è progettata per mantenere la stringa crittografata il più a lungo possibile e decrittografata solo per un periodo di tempo molto breve, cancellando la memoria dopo che è stata eseguita un'operazione su di essa.
Azzarderei dire che potresti avere alcuni problemi a livello di progettazione da affrontare prima di preoccuparti di proteggere le stringhe dell'applicazione. Dacci qualche informazione in più su ciò che stai cercando di fare e potremmo essere in grado di aiutarti meglio.
nessuna linq fantasia, non aggiungendo tutti i caratteri a mano, solo semplice e semplice:
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);
Voglio solo far notare a tutto il popolo dicendo: "Non è questo il punto di SecureString
", che molte delle persone che chiedono a questa domanda potrebbe essere in un'applicazione in cui, per qualsiasi motivo, giustificata o meno, essi sono non particolarmente preoccupati di avere una copia temporanea della password si trova nell'heap come stringa compatibile con GC, ma devono utilizzare un'API che accetta soloSecureString
oggetti. Quindi, hai un'app in cui non sai interessase la password è nell'heap, forse è solo per uso interno e la password è presente solo perché è richiesta dai protocolli di rete sottostanti e si scopre che quella stringa in cui è memorizzata la password non può essere utilizzata, ad esempio, per configurare un PowerShell remoto Runspace - ma non esiste un one-liner semplice e diretto per creare quello SecureString
che ti serve. E 'un piccolo inconveniente - ma probabilmente ne vale la pena per garantire che le applicazioni che realmente fanno è necessario che SecureString
non si tenti di utilizzare l'autori System.String
o System.Char[]
intermediari. :-)
Se desideri comprimere la conversione di a string
in a SecureString
in LINQ
un'istruzione, puoi esprimerla come segue:
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; }
);
Tuttavia, tieni presente che l'utilizzo LINQ
non migliora la sicurezza di questa soluzione. Soffre dello stesso difetto di qualsiasi conversione da string
a SecureString
. Finché l'originale string
rimane in memoria, i dati sono vulnerabili.
Detto questo, ciò che l'istruzione sopra può offrire è mantenere insieme la creazione del SecureString
, la sua inizializzazione con i dati e infine bloccarlo dalla modifica.
Le seguenti 2 estensioni dovrebbero fare il trucco:
Per un char
array
public static SecureString ToSecureString(this char[] _self)
{
SecureString knox = new SecureString();
foreach (char c in _self)
{
knox.AppendChar(c);
}
return knox;
}
E per 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;
}
Grazie a John Dagg per la AppendChar
raccomandazione.
puoi usare questo semplice script
private SecureString SecureStringConverter(string pass)
{
SecureString ret = new SecureString();
foreach (char chr in pass.ToCharArray())
ret.AppendChar(chr);
return ret;
}
12345
... questo è il genere di cose che un idiota ha nel suo bagaglio!"