どのように変換StringするのSecureStringですか?
どのように変換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');
*****
AppendChar実行時まで実行されないため、これらの文字はILから読み取ることができますか?おそらく、コンパイル時の難読化も役立つでしょう...つまり、パスワードをハードコーディングしている場合です。
SecureStringとを変換する別の方法もありStringます。
1. StringからSecureString
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2. SecureStringからStringへ
string theString = new NetworkCredential("", theSecureString).Password;
こちらがリンクです
SecureStringコードでstring保護する値を持つオブジェクトを作成する場合は、a を使用しても意味がありません。の目的はSecureString、マネージメモリに文字列が含まれないようにすることです。そのため、そのメモリを調査する攻撃者は、非表示にする値を見つけることができます。以来NetworkCredential、あなたが呼び出しているコンストラクタが...確かに行く方法はありません文字列を、必要とし、あなたのコードは、にし、SecureStringから変換する簡単な方法はあるが、それを使用すると、単純なを使用して安全なようにコードを作るstring
SecureString、一部のライブラリを操作するときにも引き続き使用する必要があります。ここで正直に言いましょう。誰かがアプリケーションのメモリをアクティブにスキャンしている場合は、すでに失っています。SecureStringを正しく使用したとしても(私がこれまでに見たことがない)、他に抽出する価値のあるデータがあるでしょう。
以下のメソッドは、文字列を安全な文字列に変換するのに役立ちます
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;
}
これは安価なlinqトリックです。
SecureString sec = new SecureString();
string pwd = "abc123"; /* Not Secure! */
pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
/* and now : seal the deal */
sec.MakeReadOnly();
これを捨てます。どうして?
すべての文字列を安全な文字列に変更するだけで、突然アプリケーションが「安全」になります。安全な文字列は、文字列を可能な限り暗号化し、操作が実行された後にメモリを消去する非常に短い期間のみ復号化するように設計されています。
アプリケーションの文字列を保護することを心配する前に、設計レベルの問題に対処する必要があるかもしれません。あなたがやろうとしていることについて、もう少し情報を提供してください。
派手なlinqはなく、手作業ですべての文字を追加するのではなく、単純明快です
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);
私は「それはポイントではない、と言って、すべての人に指摘したいSecureStringこの質問をして、人々の多くは正当かどうか、何らかの理由のために、それらがされ、アプリケーションであるかもしれないことを、」ない特に持っていることについて懸念しますパスワードの一時的なコピーはGC対応の文字列としてヒープ上に置かれのみを受け入れるAPIを使用するSecureStringオブジェクト。だから、あなたは気にしないアプリを持っていますパスワードがヒープ上にあるかどうか、おそらく内部使用のみで、パスワードはそこにのみ存在します。これは、基礎となるネットワークプロトコルによって必要とされるためです。パスワードが格納されているその文字列は、たとえばリモートPowerShellのセットアップに使用できないランスペース-しかし、を作成するための簡単でわかりやすいワンライナーSecureStringあなたが必要とすること。これはマイナーな不便さですが、本当に必要なアプリケーションが作成者や仲介者を使用するように誘惑しないことを保証するためにおそらく価値がありSecureStringます。:-)System.StringSystem.Char[]
a stringからa 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とはいえ、上記のステートメントが提供できるのは、の作成とデータによる初期化をまとめ、最後に変更からロックすることです。
次の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;
}おかげジョンDaggのためAppendCharの勧告。
あなたはこの簡単なスクリプトを使うことができます
private SecureString SecureStringConverter(string pass)
{
SecureString ret = new SecureString();
foreach (char chr in pass.ToCharArray())
ret.AppendChar(chr);
return ret;
}
12345……それは馬鹿が彼の荷物に持っているようなものです!」