2016-02-26 53 views
-5

在我的組織中,用戶必須只使用數字生成密碼(使用鍵盤訪問),最小長度爲8個數字。我怎樣才能確保密碼的用戶generats是不是太弱(使用服務器C#procossing密碼更改請求),應用下列規則:僅限數字密碼

  • 3以下電話號碼(密碼即使是一部分)是不連續的或重複(945 8401或543 784)
+3

任何企圖在你身邊? –

+0

這真的是一個編程問題嗎?似乎這與編寫實際程序無關。 –

+3

@ roryap:對我來說,這似乎是一個完全合理的問題:給定一個候選密碼,它是否違反序列/重複規則?缺乏努力是另一回事,但這絕對是一個編程問題。 –

回答

1

正則表達式是:

^((?!(?<ch>.)\k<ch>\k<ch>)(?!012|123|234|345|456|567|678|789|890)[0-9]){8,}$ 

(?!(?<ch>.)\k<ch>\k<ch>)將重複檢查三次相同的字符。請注意,對於不同的連續序列,我必須將它們放入可能序列的列表中,(?!012|123|234|345|456|567|678|789|890)[0-9]是將被接受爲有效的字符。 {8,}是最小長度。

+0

對創造力感到滿意。 – CodeCaster

+0

不錯,謝謝! –

0

如果你想有一個通用的方法,它告訴你的反覆,上升和下降的位數:

static void checkStrength(string text, out int maxRepeats, out int maxAscending, out int maxDescending) 
{ 
    maxRepeats  = 0; 
    maxAscending = 0; 
    maxDescending = 0; 

    int currRepeats = 0; 
    int currAscending = 0; 
    int currDescending = 0; 

    for (int i = 1; i < text.Length; ++i) 
    { 
     char curr = text[i]; 
     char prev = text[i-1]; 

     if (curr - prev == -1) 
      maxDescending = Math.Max(maxDescending, ++currDescending); 
     else 
      currDescending = 1; 

     if (curr - prev == 1) 
      maxAscending = Math.Max(maxAscending, ++currAscending); 
     else 
      currAscending = 1; 

     if (curr == prev) 
      maxRepeats = Math.Max(maxRepeats, ++currRepeats); 
     else 
      currRepeats = 1; 
    } 
} 

你將不得不調用這個,然後做你想要的結果是什麼:

int maxRepeats, maxAscending, maxDescending; 
checkStrength(text, out maxRepeats, out maxAscending, out maxDescending); 

if (maxRepeats > REPEAT_LIMIT || maxAscending > ASCENDING_LIMIT || maxDescending > DESCENDING_LIMIT) 
{ 
    // ... report error or whatever 
} 

如果您不需要改變允許的重複或升序數字的數量,那麼xanatos的正則表達式顯然是最短的代碼。只有在運行時需要更改允許的計數時,才需要此代碼。