2017-11-30 14 views
2

사용자가 암호문을 만들어야하는 응용 프로그램이 있습니다. 따라서 패스워드가 입력 될 때이를 테스트해야하는 다양한 규칙이 있습니다. 이것은 PasswordBox 컨트롤을 사용하여 WPF 응용 프로그램이기 때문에PasswordBox를 사용하는 동안 어떻게 복잡성 검증을 통합 할 수 있습니까?

이 규칙은,, 등, 그러나

값이 특정 길이해야 typical-- 꽤 있습니다 낮은 상단 하나, 하나, 일부 특수 문자를 포함해야 결과 값은 매우 민감합니다. 사용자가 입력하는 동안 암호를 동적으로 검사하는 복잡성 비교 시스템을 설치하려면 어떻게해야합니까?

암호 문구 암호 상자 요소 아래의 텍스트 레이블에는 모든 요구 사항 목록이 있습니다. 사용자가 입력 할 때 유효성 검사기는 어떤 요구 사항이 충족되고 어떤 요구 사항이 여전히 필요한지를 보여줍니다. 또한 엔트로피 계산기를 사용하여 요구 사항이 충족되면 일반적인 "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 문자열을 구축하지, 당신이 종료 할 때 암호의 모든 흔적은 메모리에서 삭제됩니다.