Come convertire Stringin SecureString?
Come convertire Stringin 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');
*****
AppendCharnon 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 SecureStringeString .
1. String a SecureString
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2. SecureString a String
string theString = new NetworkCredential("", theSecureString).Password;
Ecco il link
SecureStringse il codice crea un stringoggetto 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 NetworkCredentialcostruttore 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
SecureStringquando 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 SecureStringche ti serve. E 'un piccolo inconveniente - ma probabilmente ne vale la pena per garantire che le applicazioni che realmente fanno è necessario che SecureStringnon si tenti di utilizzare l'autori System.Stringo System.Char[]intermediari. :-)
Se desideri comprimere la conversione di a stringin a SecureStringin LINQun'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 LINQnon migliora la sicurezza di questa soluzione. Soffre dello stesso difetto di qualsiasi conversione da stringa SecureString. Finché l'originale stringrimane 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 chararray
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 AppendCharraccomandazione.
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!"