如何生成一个随机密码

  密码是网络生活必备之物,如何根据一个网站的要求,随机生成一个密码,请听我一一道来。

    小米的密码要求如下:长度8~16位,同时包含数字、字母,可以使用特殊符号,字母区分大小写。

    网易的密码要求如下:6~16个字符,不可以为9位以下的寸数字。

  如果细心点,你会发现一个密码有以下几个部分组成。长度、允许字符类型、共存规则。

  因此,如果需要生成一个密码,就需要从这个三方面入手。具体的类图下:

  CharLength即密码长度,AllowRule即允许存在的字符,ValidRule为共存规则,PwdChar各种类型的字符。

  根据小米密码要求,我们需要4种Pwcahr,分别是PwdLowerAlpah(小写字母),PwdNumber(数字),PwdSpecial(特殊字符),PwdUpperAlpha(大写字母);同时需要3种AllowRule,分别是allowAlpha(允许使用字母),allowNumber(允许使用数字),allowSpecial(允许使用特殊字符);密码生成之后,需要符合我们的预期,为此需要N个ValidRule,可以HasAlphaRule(必须有字母),HasNumberRule(必须有数字),MoreAlphaLessNumberRule(字符个数多于数字)。

  以后了这些原料后,就可以生成各种随机密码了。代码如下:

public class XiaoMingPwd implements MakePwdStrategy{
    private static final Random r = new Random();
   //密码长度
    private CharLength length = new CharLength(8,16);

    //允许的字符类型
    private AllowRule[] allowRules = new AllowRule[]{
        new AllowAlpha(),new AllowNumber(),new AllowSpecial()    
    };
    
    //密码的共存规则
    private ValidRule[] validRules = new ValidRule[]{
            new HasAlphaRule(),new HasNumberRule(),
            new HasSpecialRule(),new LeastButMoreThanOneSpecialRule(),
            new MoreAlphaLessNumberRule()
    };
   //字符种类
private PwdChar[] pwdChars =new PwdChar[]{ new PwdNumber(),new PwdLowerAlpha(),new PwdUpperAlpha(), new PwdSpecial() }; public String makePassword() { return getPassword(); } private String getPassword(){
     //1、随机获取密码长度
int len = length.getRandomLength(); char[] chars = null;
     //2、生成密码,直到密码符合共存规则
while(!isValidPassword(chars)){ chars = generatePassword(len); } return new String(chars); }
//判断密码是否合法
public boolean isValidPassword(char[] chars){ if(chars == null || chars.length == 0){ return false; }
//只有全部通过共存规则,才能返回true
for(ValidRule rule:validRules){ if(!rule.isSatisfiedBy(chars)){ return false; } } return true; }
//随机生成指定长度的密码
public char[] generatePassword(int length){ char[] chars = new char[length]; for(int i = 0 ; i < length; i++ ){ chars[i] = getPwdChar().getRandomChar(); } return chars; } //随机获取各种类型的字符 private PwdChar getPwdChar(){ PwdChar pchar = null; while(pchar == null){ PwdChar c = pwdChars[r.nextInt(pwdChars.length)]; for(AllowRule rule:allowRules){ if(rule.isSatisfiedBy(c)){ pchar = c; break; } } } return pchar; } }

 附件地址:https://files.cnblogs.com/MartinChen999/strategy.rar

posted on 2012-04-22 22:24  small.ming  阅读(3033)  评论(0编辑  收藏  举报

导航