2011-03-19 152 views
5

我工作的一個隨機密碼生成器創建滿足一定的條件,包括密碼的條件,但不一定侷限於:隨機密碼生成與

  • 最小長度:必須包含至少8個字符
  • 小寫字母:必須包含小寫字母(從一組選擇,以避免具有字符的問題,可能被誤認爲是數字)
  • 個大寫字母:必須包含大寫字母(同樣,從一組選定的)
  • 位數:必須包含數字

什麼是最好的算法方法,以確保生成的密碼滿足所有這些?

我不是在尋找一個完整的解決方案,我只需要一些好的想法和指導方針。

+0

http://www.texamples.com/how-to-generate-random-passwords-in-java/這可能有助於 – brainless 2012-09-12 16:13:58

+0

不確定這是一個好主意。強加限制,比如「2+」數字,可能使得密碼不那麼「隨機」,而不是更隨機/更好。 – EML 2016-05-16 18:21:43

回答

6

1)隨機生成數字L,這將是您的密碼的確切長度。也就是說,生成的結果是它大於8
2)隨機生成一個數字LL,它將是小寫字母的數量。 LC必須在範圍[1..L-2]
3)隨機生成數字LU爲大寫。必須在範圍[1..L-LL-1]
4)LD = L-LL-LU大寫字母數
5)隨機生成LL小寫字母,LU大寫字母和LD數字並保持在列表(陣列)
6)洗牌陣列隨機

HTH

+1

+1我會補充說一個好的洗牌是不平凡的:-)這是一個很好的僞代碼算法的鏈接http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle – xanatos 2011-03-19 12:16:28

+0

@xantos :或者,如果使用C++,我們可以使用'std :: random_shuffle()'方法:) – 2011-03-19 12:17:25

+0

我喜歡它。但爲什麼不在8點修正L?這是最容易記住的長度,同時仍然滿足要求。 – dana 2011-03-19 12:18:05

2
  • 創建包含的字符陣列 - Z,A - Z,0 - 9(減去任何字符,可能是令人困惑的每問題)
  • 連接8個從數組中隨機選擇的字符
  • 測試結果,看它是否滿足要求
  • 如果要求未被滿足時,重新來過

算法通常應在最初的幾個迭代成功,而不必實施爲您節省洗牌算法。

+2

絕對!它也沒有隱藏的偏見。值得注意的是,這很快以高概率終止(在找到可接受的解決方案之前的預期嘗試次數是1.4)。愚蠢的是,我沒有注意到你寫的解決方案(同樣的解決方案,但我認爲隨機函數產生的隨機字節0x00-0xFF,並沒有打擾修復範圍)。 – 2011-03-19 22:34:52

1

有一個替代Armen提出的精確建築。

  • 得到一個無限長的隨機字符串(流)
  • 懶洋洋地篩選可接受的字符(如:大寫||小寫||數字如果你的條件可以以很高的概率則滿足)
  • 在整個流中跨越期望長度的窗口,接受窗口屬性是否正常。

用一種懶惰的語言,這是大約6行非模板代碼,不需要任何洗牌。

編輯:是的,在評論中踩一個窗口,不要滑動窗口。謝謝!

+1

滑動一個窗口或步入一個窗口?如果你滑動,你會偏向密碼的分佈,以最終支持較不頻繁的字符類。假設你想要2個字符的密碼。數字比字母少,所以典型的流看起來像'abcd5efg ...'。當你滑動窗口時,你拒絕'ab','bc','cd'並接受'd5'。這個數字更有可能出現在第二個位置,因爲只要它滑入該位置,密碼就可以接受。 – aaz 2011-03-19 17:34:42

+0

對,你不應該真的滑動一個窗口,而是測試所需長度的離散塊:'loop input = let(s,r)= split如果strProp s是len,則輸入in,否則循環r。信封計算的後面說你應該測試1.4個可能的密碼來獲得一個有效密碼(對於8個字符,所以生成一個密碼平均消耗47個隨機字節)。 – 2011-03-19 19:44:25