String
をSecureString
に変換する方法
あなたはしません。 SecureStringオブジェクトを使用する理由は、文字列オブジェクト(メモリにロードされ、ガベージコレクションまでプレーンテキストで保持される)の作成を避けるためです。ただし、文字を追加することでSecureStringに文字を追加できます。
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');
SecureString
とString
の間で変換する別の方法もあります。
1。文字列からSecureString
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2。 SecureStringからString
string theString = new NetworkCredential("", theSecureString).Password;
以下のメソッドは、文字列を安全な文字列に変換するのに役立ちます
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;
}
これに従うことができます:
string password = "test";
SecureString sec_pass = new SecureString();
Array.ForEach(password.ToArray(), sec_pass.AppendChar);
sec_pass.MakeReadOnly();
これが安価なlinqトリックです。
SecureString sec = new SecureString();
string pwd = "abc123"; /* Not Secure! */
pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
/* and now : seal the deal */
sec.MakeReadOnly();
これを捨てます。どうして?
すべての文字列を変更して文字列を保護することはできず、突然アプリケーションが「安全」になります。安全な文字列は、文字列をできるだけ長く暗号化するように設計されており、操作が実行された後にメモリを消去して、非常に短い期間だけ解読します。
アプリケーション文字列の保護について心配する前に、設計レベルの問題に対処する必要があると言って危険です。あなたが何をしようとしているかについての情報をもっと教えてください。
unsafe
{
fixed(char* psz = password)
return new SecureString(psz, password.Length);
}
Spence(+1)には同意しますが、学習目的または学習目的で使用する場合は、文字列でforeachを使用し、AppendCharメソッドを使用して各文字をsecurestringに追加できます。
派手なlinqはありません。すべての文字を手動で追加するのではなく、単純で単純です。
var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);
次の2つの拡張機能でトリックを行う必要があります。
char
配列の場合
public static SecureString ToSecureString(this char[] _self)
{
SecureString knox = new SecureString();
foreach (char c in _self)
{
knox.AppendChar(c);
}
return knox;
}
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;
}
AppendChar
の推奨事項について John Dagg に感謝します。
string
からSecureString
への変換をLINQ
ステートメントに圧縮する場合は、次のように表現できます。
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; }
);
ただし、LINQ
を使用してもこのソリューションのセキュリティは向上しないことに注意してください。 string
からSecureString
への変換と同じ欠陥があります。元のstring
がメモリに残っている限り、データは脆弱です。
そうは言っても、上記のステートメントが提供できるのは、SecureString
の作成、データでの初期化、および最終的に変更からのロックです。
「それはSecureString
のポイントではない」と言っているすべての人々に指摘したい。この質問をする人々の多くは、何らかの理由で正当化されているかどうかにかかわらず、 notは、GCの文字列として一時的にパスワードのコピーをヒープに置くことを特に懸念していますが、onlyを受け入れるAPIを使用する必要がありますSecureString
オブジェクト。したがって、あなたはアプリを持っていますcareパスワードがヒープ上にあるかどうか、それは内部使用のみであり、パスワードは基礎となるネットワークプロトコルで必要とされるため、そこにあるだけですパスワードが保存されている文字列は、たとえばリモートのPowerShell Runspaceをセットアップします-しかし、必要なSecureString
を作成するための簡単で簡単なワンライナーはありません。これはささいな不便さですが、おそらく、実際にdoを必要とするアプリケーションがSecureString
を必要とすることは、作成者にSystem.String
またはSystem.Char[]
仲介者。 :-)
この簡単なスクリプトを使用できます
private SecureString SecureStringConverter(string pass)
{
SecureString ret = new SecureString();
foreach (char chr in pass.ToCharArray())
ret.AppendChar(chr);
return ret;
}