2017-07-14 2 views
0

接続文字列を暗号化および復号化しようとしています。以下は暗号化に使用されるコードです。コードをSSA Fortifyにすると、以下のようなエラーが出ます。StringBuilderをセキュアな文字列に変換します。

xyz.csは、機密データを安全でない方法で格納し、 がヒープを検査してデータを抽出できるようにします。

public static int GetSaltSize(byte[] pBytes) 
{ 
     var key = new Rfc2898DeriveBytes(pBytes, pBytes, 1000); 
     byte[] ba = key.GetBytes(2); 
     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < ba.Length; i++) 
     { 
     sb.Append(Convert.ToInt32(ba[i]).ToString()); 
     } 
     int saltSize = 0; 
     string s = sb.ToString(); // <--- insecure? 
     foreach (char c in s) 
     { 
     int intc = Convert.ToInt32(c.ToString()); 
     saltSize = saltSize + intc; 
     } 
     return saltSize; 
} 

我々はSecureStringStringBuilderを変換することができますか解決策になることができますどのような場合は私に知らせてください。

+12

は、後で文字列ビルダで、その後されたバイト配列内のデータを有し、 *既に*メモリにデータがあり、公開されています。あなたのプログラムが実際にマシンのメモリを検査している人(私が実際にここで最初に起こることは確かではない)に対して安全である必要があるなら、それはすでにその時点では遅すぎます。 – Servy

+0

文字列を安全にする方法をお探しですか?私は文字列の作成者が終わりにそれと多く関係しているとは思わない。 セキュリティで保護された文字列が必要な場合は、それを渡している可能性が高いですが、文字列ビルダーは文字列を作成するためにのみ使用されています。 –

+1

関連:https://stackoverflow.com/a/25190648/2440262 –

答えて

2

機密データをメモリに保存する専用のSecureStringクラスがあります。私はあなたのコードは、シリアル化された表現のヘッダーとして塩のサイズを追加していると思います。代わりにProtectedDataクラスを介してDPAPIを使用してください。接続文字列やその他の機密情報を安全に保存できます。

の場合、機密性の高い接続文字列を使用して、データベース接続文字列(例:SqlConnection)について考えてみます。その後、.Net接続API は、資格情報を初期化する安全な方法を公開しません。ユーザー名/パスワードは、データベース接続クラスにプレーンテキストで表示する必要があります。 SQL Server接続について話している場合、接続文字列にセンシティブな情報を必要としない統合認証を使用する必要があります。

2

あなたがメモリにたらint型を保存するのではなく3回されていないので、メモリ内の値を持っていないためにあなたの試みは、それを確保するために、すべてでみましたがないより悪いです:

  • 初回:sb.Append(Convert.ToInt32(ba[i]).ToString());
  • セカンド時間:sb.ToString();
  • 3回目:Convert.ToInt32(c.ToString());

したがって、各値は2回、完全な文は1回です。塩does not need to be secret以来


、ひいてははないか、その長さをして、あなたのコードは次のようになります。

public static int GetSaltSize(byte[] pBytes) 
{ 
    var key = new Rfc2898DeriveBytes(pBytes, pBytes, 1000); 
    byte[] ba = key.GetBytes(2); 
    return ba.SelectMany(x => ((int)x).ToString().ToCharArray()).Sum(); 
} 
+0

あなたはおそらくそれを 'return 16'とすることができます(メソッド名が正確で、結果が必要な、まだ計算されているsaltのサイズであると仮定し、バイト単位で)。現実的には、コードベースの残りの部分をよく見て、GetSaltSizeが完全に排除されることに気づくでしょう。なぜなら、これはロール独自の暗号方式の一部なのでです。 –

+0

@JeroenMostert私はちょうど静的フィールドが16であると宣言していただろうが、誰が知っている...私はちょうどその混乱をきれいにしたい –

+0

私はそれが2つの数字を加算するので、実際にはこの答えのメソッドとは少し異なりますが、これは元の文字が2桁の数字を加算するのに対し、数字は1桁で処理されるためです。 – Chris

関連する問題