<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/post//</link>
<title><![CDATA[java密码复杂度校验规则]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Tue, 10 Jan 2023 15:26:26 +0000</pubDate> 
<guid>https://www.heckjj.com/post//</guid> 
<description>
<![CDATA[ 
	系统中对密码复杂度的校验是比较常见的工作，往往我们可以通过正则来实现，或者基于规则而实现特定的算法来满足需求。<br/><br/>下面我来介绍两个开源的解决方案。<br/><br/>1.使用vt-password来实现密码复杂度的检查<br/>VT 密码是一个 Java 库，用于验证密码是否符合定义的规则集。<br/>该库包括以下规则实现：<br/><br/>AllowedCharacterRule - 密码是否只包含特定的字符列表<br/>AlphabeticalSequenceRule - 密码是否包含字母顺序<br/>CharacterCharacteristicRule - 密码是否包含所需的字符类型组合<br/>DictionaryRule - 密码是否与字典中的单词匹配<br/>DictionarySubstringRule - 密码是否包含字典中的单词<br/>DigitCharacterRule - 密码是否包含数字<br/>HistoryRule - 密码是否与以前的密码匹配，支持散列<br/>IllegalCharacterRule - 密码是否包含非法字符<br/>LengthRule - 是一定长度的密码<br/>LowercaseCharacterRule - 密码是否包含小写字符<br/>NonAlphanumericCharacterRule - 密码是否包含非字母数字字符<br/>NumericalSequenceRule - 密码是否包含数字序列<br/>RegexRule - 密码是否与正则表达式匹配<br/>RepeatCharacterRegexRule - 密码是否包含重复字符<br/>SequenceRule - 密码是否包含键盘序列<br/>SourceRule - 密码是否与来自另一个系统或来源的密码匹配<br/>QwertySequenceRule - 密码是否包含 QWERTY 键盘序列<br/>UppercaseCharacterRule - 密码是否包含大写字符<br/>UsernameRule - 密码是否包含用户名<br/>WhitespaceRule - 密码是否包含空格<br/>如果你想在你的Maven构建中使用这个项目，请在你的pom.xml 中包含以下内容：<br/><br/>&lt;dependency&gt;<br/>&nbsp;&nbsp;&lt;groupId&gt;edu.vt.middleware&lt;/groupId&gt;<br/>&nbsp;&nbsp;&lt;artifactId&gt;vt-password&lt;/artifactId&gt;<br/>&nbsp;&nbsp;&lt;version&gt;3.1.2&lt;/version&gt;<br/>&lt;/dependency&gt;<br/><br/><br/>示例代码：<br/><br/>import edu.vt.middleware.crypt.util.Base64Converter;<br/>import edu.vt.middleware.dictionary.ArrayWordList;<br/>import edu.vt.middleware.dictionary.WordListDictionary;<br/>import edu.vt.middleware.dictionary.WordLists;<br/>import edu.vt.middleware.dictionary.sort.ArraysSort;<br/>import edu.vt.middleware.password.*;<br/><br/>public class CheckDemo &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 密码的长度必须在8至16位之间 【密码长达大于等于8位】<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LengthRule lengthRule = new LengthRule(8, 16);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 不允许密码中有空格<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WhitespaceRule whitespaceRule = new WhitespaceRule();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 控制密码所需混合字符类型的规则 【特殊字符，字母大写，字母小写，数字必须包含三项】<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CharacterCharacteristicsRule charRule = new CharacterCharacteristicsRule();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 密码中至少有1位数字<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;charRule.getRules().add(new DigitCharacterRule(1));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 密码中必须包含至少1位非字母和数字的特殊字符<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;charRule.getRules().add(new NonAlphanumericCharacterRule(1));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 密码中至少有一个大写字符<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;charRule.getRules().add(new UppercaseCharacterRule(1));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 密码中至少有一个小写字符<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;charRule.getRules().add(new LowercaseCharacterRule(1));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 要求至少满足前面的3条规则<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;charRule.setNumberOfCharacteristics(3);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//用于确定密码是否包含与该密码关联的用户名的规则【密码中不能包含用户名】<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UsernameRule usernameRule = new UsernameRule() ;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 不允许3个重复字符【不能包含三个连续的字母或者数字】<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RepeatCharacterRegexRule repeatRule = new RepeatCharacterRegexRule(3);<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 不允许按字母顺序排列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AlphabeticalSequenceRule alphaSeqRule = new AlphabeticalSequenceRule();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 不允许长度为3的数字序列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumericalSequenceRule numSeqRule = new NumericalSequenceRule(3,true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 不允许qwerty序列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QwertySequenceRule qwertySeqRule = new QwertySequenceRule();<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 将所有规则分组到一个列表中<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Rule&gt; ruleList = new ArrayList&lt;Rule&gt;();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ruleList.add(lengthRule);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ruleList.add(whitespaceRule);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ruleList.add(charRule);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ruleList.add(usernameRule) ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ruleList.add(alphaSeqRule) ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ruleList.add(numSeqRule) ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ruleList.add(qwertySeqRule) ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ruleList.add(repeatRule);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化密码校验器<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PasswordValidator validator = new PasswordValidator(ruleList);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;String&gt; historyPwd = new ArrayList&lt;&gt;() ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PasswordData passwordData = PasswordData.newInstance(new Password(&quot;12abcdyuiOmm111&quot;),&quot;dsf&quot;,historyPwd,new HashMap&lt;&gt;()) ;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RuleResult result = validator.validate(passwordData);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (result.isValid()) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;Valid password&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;Invalid password:&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (String msg : validator.getMessages(result)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(msg);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/> vt-password的wiki地址<br/><br/>2.使用passay来实现密码复杂度的检查<br/>Passay 建立在 vt-password 的成功基础上，并提供了全面且可扩展的功能集，其更方便，更可扩展，并且为国际化做好了准备。<br/><br/>通过根据可配置的规则集验证候选密码来强制执行密码策略。 Passay为常见情况提供了一套全面的规则，并通过简单的规则接口支持扩展。<br/><br/>如果你想在你的Maven构建中使用这个项目，请在你的pom.xml 中包含以下内容：<br/><br/>&lt;dependency&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;groupId&gt;org.passay&lt;/groupId&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;passay&lt;/artifactId&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;version&gt;1.6.1&lt;/version&gt;<br/>&lt;/dependency&gt;<br/><br/>示例代码：<br/><br/>import org.passay.*;<br/><br/>public class PassayDemo &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PasswordValidator validator = new PasswordValidator(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new LengthRule(8, 32),&nbsp;&nbsp; // 长度规则：8 - 16 位<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new CharacterCharacteristicsRule(3,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new CharacterRule(EnglishCharacterData.UpperCase, 1),&nbsp;&nbsp;// 至少有一个大写字母<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new CharacterRule(EnglishCharacterData.LowerCase, 1),&nbsp;&nbsp;// 至少有一个小写字母<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new CharacterRule(EnglishCharacterData.Digit, 1),&nbsp;&nbsp;&nbsp;&nbsp; // 至少有一个数字<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new CharacterRule(EnglishCharacterData.Special, 1)&nbsp;&nbsp; // 至少有一个特殊字符<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) ,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new UsernameRule(),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //检查密码是否包含用户名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new RepeatCharacterRegexRule(3) ,&nbsp;&nbsp;// 检查密码是否包含重复的ASCII字符<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new IllegalSequenceRule(EnglishSequenceData.Alphabetical, 3, false),&nbsp;&nbsp;&nbsp;&nbsp;// 不允许连续 3 个字母，按字母表顺序<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new IllegalSequenceRule(EnglishSequenceData.Numerical, 3, false) ,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//不允许 3 个连续数字<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new IllegalSequenceRule(EnglishSequenceData.USQwerty, 3, false),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//不允许 QWERTY 键盘上的三个连续相邻的按键所代表的字符<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new WhitespaceRule()&nbsp;&nbsp; // 不允许包含空格<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RuleResult ruleResult = validator.validate(new PasswordData(&quot;abcqazqasdfjklkl:*(0&quot;)) ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ruleResult.isValid()) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;Valid password&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;Invalid password:&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (String msg : validator.getMessages(ruleResult)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(msg);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>更多请参考官方地址： http://www.passay.org/<br/>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post//#blogcomment</link>
<title><![CDATA[[评论] java密码复杂度校验规则]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>