2017-11-30 3 views
2

私はユーザーがパスフレーズを作成する必要があるアプリケーションを持っています。このように、入力時にパスフレーズに対してテストする必要のあるさまざまなルールがあります。このPasswordBox制御を使用してWPFアプリケーションであるのでPasswordBoxを使用して複雑さの検証を統合するにはどうすればよいですか?

これらの規則は、等、しかし

値は一定の長さでなければならないtypical--、かなりある上下いずれか一方が、いくつかの特殊文字が含ま有します結果の値は非常に敏感ですが、ユーザーが入力しているときにパスフレーズを動的にチェックする複雑性比較システムを設定するにはどうすればよいですか?

私は、パスフレーズ作成のPasswordBox要素の下のテキストラベルにすべての要件のリストを示しています。ユーザーが入力すると、バリデーターはどの要件が満たされ、どの要件がまだ必要であるかを示します。条件が満たされると、典型的な「OK、Good、Strong、Very Strong」指標を与えるエントロピー計算機もあります。これは、ユーザーが入力しているときに値を安全に検証する方法を見つける必要がある理由です。

安全でない.Net文字列を出さずにこれを実現するにはどうすればよいですか?

答えて

2

PasswordChangedに登録することはできますが、あなたの感覚価値を安全に保存することを心がけている場合はPasswordプロパティを使用しないでください。代わりに、次の操作を行います。

private void OnPasswordChanged(object sender, RoutedEventArgs e) {    
    using (var pwd = ((PasswordBox) sender).SecurePassword) { 
     int length = pwd.Length; 
     if (length == 0) { 
      // string empty, do something 
      return; 
     } 
     bool hasSpecial = false; 
     bool hasUpper = false; 
     bool hasLower = false; 
     bool hasDigit = false; 
     // etc 
     // allocate unmanaged memory and copy string there 
     IntPtr ptr = Marshal.SecureStringToBSTR(pwd); 
     try { 
      // each char in that string is 2 bytes, not one (it's UTF-16 string) 
      for (int i = 0; i < length * 2; i += 2) { 
       // so use ReadInt16 and convert resulting "short" to char 
       var ch = Convert.ToChar(Marshal.ReadInt16(ptr + i)); 
       // run your checks 
       hasSpecial |= IsSpecialChar(ch); 
       hasUpper |= Char.IsUpper(ch); 
       hasLower |= Char.IsLower(ch); 
       hasDigit |= Char.IsDigit(ch);       
      } 

     } 
     finally { 
      // don't forget to zero memory to remove password from it      
      Marshal.ZeroFreeBSTR(ptr); 
     } 
    } 
} 

そのように、あなたの検証中に、.NET文字列を構築することはありません、あなたが終了したときに、パスワードのすべてのトレースは、メモリから消去されます。

関連する問題