2009-03-12 9 views
0

.Netフレームワークの既存のSecureString型を拡張するために、私はSecureStringV2と呼ばれる安全な文字列型を構築し始めました。この新しい型は、既存の型と同等の点検、比較などの基本機能をいくつか追加しますが、SecureString型によって提供されるセキュリティを維持します。私はMarshalクラスとハッシュアルゴリズムを使ってこれらの機能を実現する予定です。これをやり遂げる方法についての指針は正しく評価されます。これを実装する私のアイデアに何か問題があるとお考えですか?ありがとうございました:)セキュアな文字列型を構築する際の注意点

更新:これは私のアイデアがここまで、図書館のコアクラスに関して私を導いています。見て、私の考えを知らせてください。

/// <summary> 
/// This class is extension of the SecureString Class in the .Net framework. 
/// It provides checks for equality of multiple SStringV2 instances and maintains 
/// the security provided by the SecureString Class 
/// </summary> 
public class SStringV2 : IEquatable<SStringV2> , IDisposable 
{ 
    private SecureString secureString = new SecureString(); 
    private Byte[] sStringBytes; 
    private String hash = string.Empty; 

    /// <summary> 
    /// SStringV2 constructor 
    /// </summary> 
    /// <param name="confidentialData"></param> 
    public SStringV2(ref Char[] confidentialData) 
    { 
     GCHandle charArrayHandle = GCHandle.Alloc(confidentialData, GCHandleType.Pinned); 
     // The unmanaged string splices a zero byte inbetween every two bytes 
     //and at its end doubling the total number of bytes 
     sStringBytes = new Byte[confidentialData.Length*2]; 
     try 
     { 
      for (int index = 0; index < confidentialData.Length; ++index) 
      {     
       secureString.AppendChar(confidentialData[index]); 
      } 
     } 
     finally 
     { 
      ZeroOutSequence.ZeroOutArray(ref confidentialData); 
      charArrayHandle.Free(); 
     } 
    } 

    /// <summary> 
    /// Computes the hash value of the secured string 
    /// </summary> 
    private void GenerateHash() 
    { 
     IntPtr unmanagedRef = Marshal.SecureStringToBSTR(secureString); 
     GCHandle byteArrayHandle = GCHandle.Alloc(sStringBytes, GCHandleType.Pinned); 
     Marshal.Copy(unmanagedRef, sStringBytes, 0, sStringBytes.Length); 
     SHA256Managed SHA256 = new SHA256Managed(); 

     try 
     { 
      hash = Convert.ToBase64String(SHA256.ComputeHash(this.sStringBytes)); 
     } 
     finally 
     { 
      SHA256.Clear(); 
      ZeroOutSequence.ZeroOutArray(ref sStringBytes); 
      byteArrayHandle.Free(); 
      Marshal.ZeroFreeBSTR(unmanagedRef); 
     } 
    } 

    #region IEquatable<SStringV2> Members 

    public bool Equals(SStringV2 other) 
    { 
     if ((this.hash == string.Empty) & (other.hash == string.Empty)) 
     { 
      this.GenerateHash(); 
      other.GenerateHash(); 
     } 
     else if ((this.hash == string.Empty) & !(other.hash == string.Empty)) 
     { 
      this.GenerateHash(); 
     } 
     else if (!(this.hash == string.Empty) & (other.hash == string.Empty)) 
     { 
      other.GenerateHash(); 
     } 

     if (this.hash.Equals(other.hash)) 
     { 
      return true; 
     } 
      return false; 
    } 

    #endregion 

    #region IDisposable Members 

    public void Dispose() 
    { 
     secureString.Dispose(); 
     hash = string.Empty; 
     GC.SuppressFinalize(this); 
    } 

    #endregion 
} 

}あなたがsecurestringの利益を失い始めるには、あなたがchar []配列を渡す場合

+0

比較方法に「&」を使用しています。それらは '&&'でなければなりません。 – Doug

答えて

0

。 char []配列は、消去される前にガベージコレクタによってメモリ内にコピーされる可能性があります。

+0

本当に、char []配列を渡した直後にピンを固定すると、少なくとも内部的には問題が解決するはずです。これはそれを行う必要があります: GCHandle.Alloc(confidentialData、GCHandleType.Pinned); – gogole

+1

まだ間違っています。 Appendのようなメソッドしか持たないようにしてください。私は実際にsecurestringがヘビ油だと思う。私は、ssが使用されている場合の99%において、センシティブなデータが誤ってディスクに書き込まれる危険性があると考えています。なぜなら、それがssに入る前にプログラムのどこかに格納されているからです。 –

+0

私はssの2つの使用例を見る。 1)スワップするために安全なデータが漏れないように保護する。それは多くの警告でそれで 'ok'仕事をします。 2)アクティブなローカル攻撃者から保護します。この場合、ローカルの攻撃者がSecureStringに追加されたすべての文字列をログに記録できるため、状況が悪化します。 –

1

ハッシュ・イコールとデータの平等を間違えている問題を尋ねています - 違いが出る確率は低いですが、一度ヒットすると悪夢になるでしょう:/ "これは数年前に同じミスを犯したカスタムハッシュマップの実装をデバッグして修正するため、これで私を信頼してください。

+0

これについて詳しく説明できますか。私の見解では、Equals()メソッドが呼び出された後に関連する値に初期化されたままになるのは、SecureStringとHashだけです。ハッシュ値が等しい場合は、比較される2つのインスタンスが等しいことを安全に一般化できると信じています。 – gogole

+0

問題をはっきりと表示するには:文字列を100倍長くしてハッシュすると、これ以上の長さの複数の文字列は同じハッシュを持つ必要がありますか?使用しているハッシュ関数に応じて、与えられた確率で短い文字列にも同じことが言えます) – RnR

+0

オハイオ州オハイオ州オハイオ州オハイオ州、私は今、あなたの視点を得ていると思う。ハッシュ関数には特定のバイトを抽出しないため、2つの文字列のわずかな違いは確実に異なるハッシュを生成します。ヘッドアップありがとう:) – gogole

1

SecureStringが双方向暗号化を使用していることを忘れないでください。あなたのクラスでは暗号化が表示されません。

関連する問題