web-dev-qa-db-ja.com

文字列をSecureStringに変換

StringSecureStringに変換する方法

98
Developer404

あなたはしません。 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');
112
John Dagg

SecureStringStringの間で変換する別の方法もあります。

1。文字列からSecureString

SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;

2。 SecureStringからString

string theString = new NetworkCredential("", theSecureString).Password;

リンク

105

以下のメソッドは、文字列を安全な文字列に変換するのに役立ちます

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;
}
51
M2012

これに従うことができます:

string password = "test";
SecureString sec_pass = new SecureString();
Array.ForEach(password.ToArray(), sec_pass.AppendChar);
sec_pass.MakeReadOnly();
17
Scorpio

これが安価なlinqトリックです。

            SecureString sec = new SecureString();
            string pwd = "abc123"; /* Not Secure! */
            pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
            /* and now : seal the deal */
            sec.MakeReadOnly();
7
granadaCoder

これを捨てます。どうして?

すべての文字列を変更して文字列を保護することはできず、突然アプリケーションが「安全」になります。安全な文字列は、文字列をできるだけ長く暗号化するように設計されており、操作が実行された後にメモリを消去して、非常に短い期間だけ解読します。

アプリケーション文字列の保護について心配する前に、設計レベルの問題に対処する必要があると言って危険です。あなたが何をしようとしているかについての情報をもっと教えてください。

7
Spence
unsafe 
{
    fixed(char* psz = password)
        return new SecureString(psz, password.Length);
}
6
hypersw

Spence(+1)には同意しますが、学習目的または学習目的で使用する場合は、文字列でforeachを使用し、AppendCharメソッドを使用して各文字をsecurestringに追加できます。

4
Jonathan

派手なlinqはありません。すべての文字を手動で追加するのではなく、単純で単純です。

var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);
3
garglblarg

次の2つの拡張機能でトリックを行う必要があります。

  1. char配列の場合

    public static SecureString ToSecureString(this char[] _self)
    {
        SecureString knox = new SecureString();
        foreach (char c in _self)
        {
            knox.AppendChar(c);
        }
        return knox;
    }
    
  2. 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 に感謝します。

2
Peet

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の作成、データでの初期化、および最終的に変更からのロックです。

2
cel sharp

「それはSecureStringのポイントではない」と言っているすべての人々に指摘したい。この質問をする人々の多くは、何らかの理由で正当化されているかどうかにかかわらず、 notは、GCの文字列として一時的にパスワードのコピーをヒープに置くことを特に懸念していますが、onlyを受け入れるAPIを使用する必要がありますSecureStringオブジェクト。したがって、あなたはアプリを持っていますcareパスワードがヒープ上にあるかどうか、それは内部使用のみであり、パスワードは基礎となるネットワークプロトコルで必要とされるため、そこにあるだけですパスワードが保存されている文字列は、たとえばリモートのPowerShell Runspaceをセットアップします-しかし、必要なSecureStringを作成するための簡単で簡単なワンライナーはありません。これはささいな不便さですが、おそらく、実際にdoを必要とするアプリケーションがSecureStringを必要とすることは、作成者にSystem.StringまたはSystem.Char[]仲介者。 :-)

2

この簡単なスクリプトを使用できます

private SecureString SecureStringConverter(string pass)
{
    SecureString ret = new SecureString();

    foreach (char chr in pass.ToCharArray())
        ret.AppendChar(chr);

    return ret;
}
1
nadir