使用某些必需条件(大写字母,数字,特殊字符)生成固定长度的密码字符串

时间:2015-08-19 12:18:38

标签: ruby

我正在尝试生成一定长度的安全密码,以满足特定条件。

e.g。我想(比方说)一个10个字母的密码:

至少有1个大写字母

至少有1个小写字母

至少有一个号码

至少有1个下划线(或其他字符,但由于某些限制,只有下划线被接受,因此下划线很好)

我试过

SecureRandom.url_safeBase64(10)

但是这会生成太长的字符串,并不能保证每个限制都存在。

想知道是否有一种简单的方法......

2 个答案:

答案 0 :(得分:5)

low = ('a'..'d').to_a
up  = ('A'..'Z').to_a
num = ('0'..'9').to_a
u   = ['_']
any = low + up + num + u
pw  = (low.sample(1) + 
       up.sample(1) + 
       num.sample(1) + 
       u.sample(1) +
       any.sample(6)).shuffle.join

答案 1 :(得分:1)

我从未听说过内置的开箱即用功能,但您可能会这样做:

samples = [('a'..'z'), ('A'..'Z'), (0..9), ['_']].map &:to_a
(samples.map(&:sample) + \ # ensure at least one of each group
  (10-4).times.map do      # 4 are already chosen
    samples.flatten[rand(samples.flatten.size)] # pick random
  end).shuffle.join