如何生成一个随机密码
密码是网络生活必备之物,如何根据一个网站的要求,随机生成一个密码,请听我一一道来。
小米的密码要求如下:长度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; } }
posted on 2012-04-22 22:24 small.ming 阅读(3038) 评论(0) 编辑 收藏 举报