Java 验证密码复杂度的正则表达式

一 正则表达式


 
 
  1. 复杂(同时包含数字,字母,特殊符号)
  2. "^^(?![a-zA-z]+$)(?!\\d+$)(?![!@#$%^&*_-]+$)(?![a-zA-z\\d]+$)(?![a-zA-z!@#$%^&*_-]+$)(?![\\d!@#$%^&*_-]+$)[a-zA-Z\\d!@#$%^&*_-]+$"
  3. 简单(只包含数字或字母)
  4. "^(?:\\d+|[a-zA-Z]+|[!@#$%^&*]+)$"
  5. 中级(包含字母和数字)
  6. "^(?![a-zA-z]+$)(?!\\d+$)(?![!@#$%^&*]+$)[a-zA-Z\\d!@#$%^&*]+$"

二 弱密码校验


 
 
  1. package com.hm.platform.common.util;
  2. import org.apache.commons.lang.StringUtils;
  3. /**
  4. *
  5. * @ClassName: PwdCheckUtil.java
  6. * @Description: 密码校验工具类
  7. */
  8. public class PwdCheckUtil {
  9. public static String[] KEYBOARD_SLOPE_ARR = {
  10. "!qaz", "1qaz", "@wsx", "2wsx", "#edc", "3edc", "$rfv", "4rfv", "%tgb", "5tgb",
  11. "^yhn", "6yhn", "&ujm", "7ujm", "*ik,", "8ik,", "(ol.", "9ol.", ")p;/", "0p;/",
  12. "+[;.", "=[;.", "_pl,", "-pl,", ")okm", "0okm", "(ijn", "9ijn", "*uhb", "8uhb",
  13. "&ygv", "7ygv", "^tfc", "6tfc", "%rdx", "5rdx", "$esz", "4esz"
  14. };
  15. public static String[] KEYBOARD_HORIZONTAL_ARR = {
  16. "01234567890-=",
  17. "!@#$%^&*()_+",
  18. "qwertyuiop[]",
  19. "QWERTYUIOP{}",
  20. "asdfghjkl;'",
  21. "ASDFGHJKL:",
  22. "zxcvbnm,./",
  23. "ZXCVBNM<>?",
  24. };
  25. public static String DEFAULT_SPECIAL_CHAR= "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
  26. public static String SPECIAL_CHAR = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
  27. public static void main(String[] args) {
  28. //System.out.print(checkSequentialSameChars("AAAAA", 5));
  29. //System.out.print(checkSequentialChars("Abcks", 3, true));
  30. //System.out.print(checkKeyboardSlantSite("Qaz", 3, false));
  31. //System.out.print(checkLateralKeyboardSite("qwer", 3, false));
  32. }
  33. /**
  34. * @brief 检测密码中字符长度
  35. * @param[in] password 密码字符串
  36. * @return 符合长度要求 返回true
  37. */
  38. public static boolean checkPasswordLength(String password, String minNum, String maxNum) {
  39. boolean flag = false;
  40. if (StringUtils.isBlank(maxNum)) {
  41. minNum = StringUtils.isBlank(minNum) == true ? "0":minNum;
  42. if (password.length() >= Integer.parseInt(minNum)) {
  43. flag = true;
  44. }
  45. } else {
  46. minNum = StringUtils.isBlank(minNum) == true ? "0":minNum;
  47. if (password.length() >= Integer.parseInt(minNum) &&
  48. password.length() <= Integer.parseInt(maxNum)) {
  49. flag = true;
  50. }
  51. }
  52. return flag;
  53. }
  54. /**
  55. * @brief 检测密码中是否包含数字
  56. * @param[in] password 密码字符串
  57. * @return 包含数字 返回true
  58. */
  59. public static boolean checkContainDigit(String password) {
  60. char[] chPass = password.toCharArray();
  61. boolean flag = false;
  62. int num_count = 0;
  63. for ( int i = 0; i < chPass.length; i++) {
  64. if (Character.isDigit(chPass[i])) {
  65. num_count++;
  66. }
  67. }
  68. if (num_count >= 1){
  69. flag = true;
  70. }
  71. return flag;
  72. }
  73. /**
  74. * @brief 检测密码中是否包含字母(不区分大小写)
  75. * @param[in] password 密码字符串
  76. * @return 包含字母 返回true
  77. */
  78. public static boolean checkContainCase(String password) {
  79. char[] chPass = password.toCharArray();
  80. boolean flag = false;
  81. int char_count = 0;
  82. for ( int i = 0; i < chPass.length; i++) {
  83. if (Character.isLetter(chPass[i])) {
  84. char_count++;
  85. }
  86. }
  87. if (char_count >= 1) {
  88. flag = true;
  89. }
  90. return flag;
  91. }
  92. /**
  93. * @brief 检测密码中是否包含小写字母
  94. * @param[in] password 密码字符串
  95. * @return 包含小写字母 返回true
  96. */
  97. public static boolean checkContainLowerCase(String password) {
  98. char[] chPass = password.toCharArray();
  99. boolean flag = false;
  100. int char_count = 0;
  101. for ( int i = 0; i < chPass.length; i++) {
  102. if (Character.isLowerCase(chPass[i])) {
  103. char_count++;
  104. }
  105. }
  106. if (char_count >= 1) {
  107. flag = true;
  108. }
  109. return flag;
  110. }
  111. /**
  112. * @brief 检测密码中是否包含大写字母
  113. * @param[in] password 密码字符串
  114. * @return 包含大写字母 返回true
  115. */
  116. public static boolean checkContainUpperCase(String password) {
  117. char[] chPass = password.toCharArray();
  118. boolean flag = false;
  119. int char_count = 0;
  120. for ( int i = 0; i < chPass.length; i++) {
  121. if (Character.isUpperCase(chPass[i])) {
  122. char_count++;
  123. }
  124. }
  125. if (char_count >= 1) {
  126. flag = true;
  127. }
  128. return flag;
  129. }
  130. /**
  131. * @brief 检测密码中是否包含特殊符号
  132. * @param[in] password 密码字符串
  133. * @return 包含特殊符号 返回true
  134. */
  135. public static boolean checkContainSpecialChar(String password) {
  136. char[] chPass = password.toCharArray();
  137. boolean flag = false;
  138. int special_count = 0;
  139. for ( int i = 0; i < chPass.length; i++) {
  140. if (SPECIAL_CHAR.indexOf(chPass[i]) != - 1) {
  141. special_count++;
  142. }
  143. }
  144. if (special_count >= 1){
  145. flag = true;
  146. }
  147. return flag;
  148. }
  149. /**
  150. * @brief 键盘规则匹配器 横向连续检测
  151. * @param[in] password 密码字符串
  152. * @return 含有横向连续字符串 返回true
  153. */
  154. public static boolean checkLateralKeyboardSite(String password, int repetitions, boolean isLower) {
  155. String t_password = new String(password);
  156. //将所有输入字符转为小写
  157. t_password = t_password.toLowerCase();
  158. int n = t_password.length();
  159. /**
  160. * 键盘横向规则检测
  161. */
  162. boolean flag = false;
  163. int arrLen = KEYBOARD_HORIZONTAL_ARR.length;
  164. int limit_num = repetitions ;
  165. for( int i= 0; i+limit_num<=n; i++) {
  166. String str = t_password.substring(i, i+limit_num);
  167. String distinguishStr = password.substring(i, i+limit_num);
  168. for( int j= 0; j<arrLen; j++) {
  169. String configStr = KEYBOARD_HORIZONTAL_ARR[j];
  170. String revOrderStr = new StringBuffer(KEYBOARD_HORIZONTAL_ARR[j]).reverse().toString();
  171. //检测包含字母(区分大小写)
  172. if (isLower) {
  173. //考虑 大写键盘匹配的情况
  174. String UpperStr = KEYBOARD_HORIZONTAL_ARR[j].toUpperCase();
  175. if((configStr.indexOf(distinguishStr) != - 1) || (UpperStr.indexOf(distinguishStr) != - 1)) {
  176. flag = true;
  177. return flag;
  178. }
  179. //考虑逆序输入情况下 连续输入
  180. String revUpperStr = new StringBuffer(UpperStr).reverse().toString();
  181. if((revOrderStr.indexOf(distinguishStr) != - 1) || (revUpperStr.indexOf(distinguishStr) != - 1)) {
  182. flag = true;
  183. return flag;
  184. }
  185. } else {
  186. if(configStr.indexOf(str) != - 1) {
  187. flag = true;
  188. return flag;
  189. }
  190. //考虑逆序输入情况下 连续输入
  191. if(revOrderStr.indexOf(str) != - 1) {
  192. flag = true;
  193. return flag;
  194. }
  195. }
  196. }
  197. }
  198. return flag;
  199. }
  200. /**
  201. *
  202. * @Title: checkKeyboardSlantSite
  203. * @Description: 物理键盘,斜向连接校验, 如1qaz,4rfv, !qaz,@WDC,zaq1 返回true
  204. * @param password 字符串
  205. * @param repetitions 重复次数
  206. * @param isLower 是否区分大小写 true:区分大小写, false:不区分大小写
  207. * @return boolean 如1qaz,4rfv, !qaz,@WDC,zaq1 返回true
  208. * @throws
  209. */
  210. public static boolean checkKeyboardSlantSite(String password, int repetitions, boolean isLower) {
  211. String t_password = new String(password);
  212. t_password = t_password.toLowerCase();
  213. int n = t_password.length();
  214. /**
  215. * 键盘斜线方向规则检测
  216. */
  217. boolean flag = false;
  218. int arrLen = KEYBOARD_SLOPE_ARR.length;
  219. int limit_num = repetitions;
  220. for( int i= 0; i+limit_num<=n; i++) {
  221. String str = t_password.substring(i, i+limit_num);
  222. String distinguishStr = password.substring(i, i+limit_num);
  223. for( int j= 0; j<arrLen; j++) {
  224. String configStr = KEYBOARD_SLOPE_ARR[j];
  225. String revOrderStr = new StringBuffer(KEYBOARD_SLOPE_ARR[j]).reverse().toString();
  226. //检测包含字母(区分大小写)
  227. if (isLower) {
  228. //考虑 大写键盘匹配的情况
  229. String UpperStr = KEYBOARD_SLOPE_ARR[j].toUpperCase();
  230. if((configStr.indexOf(distinguishStr) != - 1) || (UpperStr.indexOf(distinguishStr) != - 1)) {
  231. flag = true;
  232. return flag;
  233. }
  234. //考虑逆序输入情况下 连续输入
  235. String revUpperStr = new StringBuffer(UpperStr).reverse().toString();
  236. if((revOrderStr.indexOf(distinguishStr) != - 1) || (revUpperStr.indexOf(distinguishStr) != - 1)) {
  237. flag = true;
  238. return flag;
  239. }
  240. } else {
  241. if(configStr.indexOf(str) != - 1) {
  242. flag = true;
  243. return flag;
  244. }
  245. //考虑逆序输入情况下 连续输入
  246. if(revOrderStr.indexOf(str) != - 1) {
  247. flag = true;
  248. return flag;
  249. }
  250. }
  251. }
  252. }
  253. return flag;
  254. }
  255. /**
  256. * @Title: checkSequentialChars
  257. * @Description: 评估a-z,z-a这样的连续字符,
  258. * @param password 字符串
  259. * @param repetitions 连续个数
  260. * @param isLower 是否区分大小写 true:区分大小写, false:不区分大小写
  261. * @return boolean 含有a-z,z-a连续字符串 返回true
  262. * @throws
  263. */
  264. public static boolean checkSequentialChars(String password, int repetitions, boolean isLower) {
  265. String t_password = new String(password);
  266. boolean flag = false;
  267. int limit_num = repetitions;
  268. int normal_count = 0;
  269. int reversed_count = 0;
  270. //检测包含字母(区分大小写)
  271. if (!isLower) {
  272. t_password = t_password.toLowerCase();
  273. }
  274. int n = t_password.length();
  275. char[] pwdCharArr = t_password.toCharArray();
  276. for ( int i= 0; i+limit_num<=n; i++) {
  277. normal_count = 0;
  278. reversed_count = 0;
  279. for ( int j= 0; j<limit_num- 1; j++) {
  280. if (pwdCharArr[i+j+ 1]-pwdCharArr[i+j]== 1) {
  281. normal_count++;
  282. if(normal_count == limit_num - 1){
  283. return true;
  284. }
  285. }
  286. if (pwdCharArr[i+j]-pwdCharArr[i+j+ 1]== 1) {
  287. reversed_count++;
  288. if(reversed_count == limit_num - 1){
  289. return true;
  290. }
  291. }
  292. }
  293. }
  294. return flag;
  295. }
  296. /**
  297. *
  298. * @Title: checkSequentialSameChars
  299. * @Description: 验证键盘上是否存在多个连续重复的字符, 如!!!!, qqqq, 1111, ====, AAAA返回true
  300. * @param password 字符串
  301. * @param repetitions 重复次数
  302. * @return 参数
  303. * @return boolean 返回类型
  304. * @throws
  305. */
  306. public static boolean checkSequentialSameChars(String password, int repetitions) {
  307. String t_password = new String(password);
  308. int n = t_password.length();
  309. char[] pwdCharArr = t_password.toCharArray();
  310. boolean flag = false;
  311. int limit_num = repetitions;
  312. int count = 0;
  313. for ( int i= 0; i+limit_num<=n; i++) {
  314. count= 0;
  315. for ( int j= 0; j<limit_num- 1; j++) {
  316. if(pwdCharArr[i+j] == pwdCharArr[i+j+ 1]) {
  317. count++;
  318. if (count == limit_num - 1){
  319. return true;
  320. }
  321. }
  322. }
  323. }
  324. return flag;
  325. }
  326. }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值