1

我正在嘗試糾正一些代碼,以防止用戶在密碼提示中輸入密碼。我正考慮防止用戶在其密碼提示中輸入密碼中的三個連續字符,即使它們被一個字符分隔,即p-a-s-s-w-o-r-d。在密碼提示中檢查密碼

我寫了下面的代碼,但是這可以防止密碼提示,如:密碼:p123a21312swert1這是太嚴格。這是因爲我從密碼提示中刪除了所有不在密碼中的字符。我有一個搜索,但無法找到任何相關的。

var strippedPwdHint = new string(sValue.Where(c => sCompareTo.ToCharArray().Contains(c)).ToArray()); 

for (var i = 0; i < (strippedPwdHint.Length - 2); i++) 
{ 
    if (!sCompareTo.Contains(strippedPwdHint.Substring(i, 3))) continue; 
    retVal = new ValidationResult(ErrorMessage); 
    break; 
} 
+2

提示:提示包含密碼中的所有字符,並且它們的順序相同(或按相反順序排列)。但我不會走得太遠,規則往往不僅僅是爲用戶煩人...... –

+0

是的,但我認爲我是想防止一個字符的分離,例如p-a-s-s-w-o-r-d。 – DesiBoyz

+0

我的意思是檢查密碼中的所有字符是否以相同的順序出現在提示中,無論中間有多少個「分隔符」:p111a222s333s444w555o666r777d。有點極端的情況下,但我想你明白我的意思。對於一個不錯的口令(足夠長和/或足夠複雜),在提示中寫入相同字符的機率應該接近於零。另外需要注意的是:你正在討論_characters_,但是你要檢查的是_code units_(字符串是Unicode UTF-16編碼文本),它不一樣。 –

回答

1

在這種情況下,這往往是「我能走多遠?」的情況。因爲你不可能覆蓋所有情況。除了這些明顯而且應該阻止一個人的東西可能如此晦澀難懂以外,對其他人無關緊要。

雖然檢查提示與向前或向後的密碼不匹配很簡單,但做更多事情的一個顯而易見的事情會很快變得複雜。

假設你有

string password = [Password] 
string hint = [Password Hint] 

簡單比較的密碼,並提示會標誌的情況下它們匹配

bool invalid = password.Compare(hint); 

抓住你可以做這樣的事情

string reversed = new string(hint.ToCharArray().Reverse().ToArray()); 
bool invalid = password.Compare(reversed); 
相反的情況

如果像你所說的那樣你有這樣的東西

string hint = "P-a-s-s-w-o-r-d"; 

,你知道的空格字符,那麼你可以替換則比較

bool invalid = password.Compare(hint.Replace("-","")); 

但是,如果你不知道什麼是空格字符它更復雜,你必須要小心您不會將法律方案標記爲無效。

假設您只想排除提示是密碼+常規間距的場景,例如「密碼」一個辦法可能是

  • 找到的第一個和第二個密碼字符之間的間距提示
  • 步驟通過在這些步驟的提示比較密碼

而且問題的提示包括

  • 間距字符是否重要?例如,與P-a-s-s-w-o-r-d相比,你如何處理P-a-s-s!w!o!r!d?
  • 你關心多少個間距字符?例如,P後跟20個字符,那麼密碼是否有效?

這就是說,它可能不值得變得太複雜,並將提示與密碼向前和向後比較可能就足夠了。