網站首頁 編程語言 正文
需求
??最近在最做一個軟件的注冊登錄的功能,需要用到對密碼強度的判斷,并對當前輸入的密碼的強度進行輸出。需求里對密碼分了三級,分別是低強度、中強度、高強度,但是沒有對什么是低強度、什么是高強度進行詳細分類,所以自己在做的時候簡單做了下分類。對密碼分類后,我想到的是使用Regex表達式直接判斷密碼的強度,密碼字符串輸入然后輸出對應強度等級就行。
??這里用到Regex表達式,雖然還是經常使用,但是對其語法還是一知半解。主要一般用到都比較簡單,不需要多重判斷。在網上一番搜索后,基本沒有找到符合我要求的Regex表達式。雖然可以用if...else...進行進行分步判斷,但是對于我等強迫癥而言,能用一句代碼說明的事情絕對不寫第二句。所以還是頭疼了好一會的。大體看了下別人怎么寫的,簡單對照了下語法設計,然后開始著手自己的密碼強度判斷Regex表達式的書寫。
在線測試Regex
https://www.goregex.cn/
正文
密碼強度分類
??首先完成對密碼強度等級的分類。密碼為6-16位,分為低、中、高3個等級。密碼是大小寫字母,數字,英文標點的隨機組合。密碼強度等級對照表:
長度 | 描述 | 強度 |
---|---|---|
6<=長度<=8 | 純數字 | 低 |
- | 純數字 | 低 |
- | 純字母 | 低 |
- | 純英文標點 | 低 |
- | 數字+字母 | 中 |
- | 數字+標點 | 中 |
- | 字母+標點 | 中 |
- | 數字+字母+標點 | 高 |
9<=長度<=12 | 純數字 | 中 |
- | 純字母 | 中 |
- | 純英文標點 | 中 |
- | 數字+字母 | 高 |
- | 數字+標點 | 高 |
- | 字母+標點 | 高 |
- | 數字+字母+標點 | 高 |
13<=長度<=16 | 所有 | 高 |
Regex分析
??Regex表達式再復雜也逃不過最基礎的與或非關系,我們完全可以從這方面對復雜的Regex表達式進行拆分。
??在此之前需要理解以下幾種符號的含義。
符號 | 描述 |
---|---|
^ | 匹配輸入字符串的開始位置 |
$ | 匹配輸入字符串的結束位置 |
. | 匹配除 "\n" 之外的任何單個字符 |
* | 匹配前面的子表達式零次或多次 |
+ | 匹配前面的子表達式一次或多次 |
? | 匹配前面的子表達式零次或一次 |
\d | 匹配一個數字字符。等價于[0-9] |
\S | 匹配任何非空白字符 |
[xyz] | 字符種類。匹配?括號內的任意字符 |
(xyz) | 字符集,匹配與 xyz 完全相等的字符串 |
[a-z] | 匹配 'a' 到 'z' 范圍內的任意小寫字母字符 |
(?=x) | 正向肯定預查詢包含x |
{4,8 | }匹配4到8位長度的字符 |
| | 或運算符 |
\ | 轉義字符,?于匹配?些保留的字符{}.*+?^$\| |
[^x] | 匹配除了x以外的任意字符 |
??拿低強度的密碼來說,首先需要滿足6-8位,其次全是數字或全是字母或全是標點符號,只滿足這兩個條件的就是低強度的密碼。拆分開后就好實現了。
先看怎么實現滿足6-8位的表達式。
^\S{6,8}$ //任何非空白字符,且滿足6-8位
匹配都是數字的情況。
^\d+$
匹配都是字母的情況。
^[A-Za-z]+$
匹配都是符號的情況。
^[!@#$%^&*?=]+$
拼接在一起,就是低強度密碼的正則表達式:
(?=^\d+$|^[A-Za-z]+$|^[!@#$%^&*?=]+$)^\S{6,8}$
中強度密碼同理。
匹配6-8位同時包含數字+字母的情況。可以理解為包含數字、字母的字符串,但不全是數字或不全是字母。
(?=.*\d)(?=.*[A-Za-z])(?=^[\dA-Za-z]+$)^\S{6,8}$
匹配6-8位同時包含數字+標點(!@#$=%^&*?)的情況。同上。
(?=.*\d)(?=.*[!@#$=%^&*?])(?=^[\d!@#$=%^&*?]+$)^\S{6,8}$
匹配6-8位同時包含字母+標點的情況。同上。
(?=.*[A-Za-z])(?=.*[!@#$%^&*?])(?=^[A-Za-z!@#$=%^&*?]+$)^\S{6,8}$
然后再加上匹配9-12位純數字,純字母,純標點的情況。與之前的寫法相同。
高強度密碼同理。
補充:密碼強度 弱 中 強 正則表達式判斷
今天看了下項目中的注冊頁源碼,順帶著看了下判斷密碼強度的正則表達式,寫的很好,最起碼比我寫的好,所以記錄下來留著以后參考
代碼如下
var strongRegex = new RegExp("^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\\W).*$", "g") ?//強
var mediumRegex = new RegExp("^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$", "g") ?//中
var enoughRegex = new RegExp("(?=.{6,}).*", "g") //弱
用input 的keyup() 方法每輸入一個字符用 正則的 enoughRegex.test(password) 方法去檢測密碼
本人之前也學過正則表達式的一點皮毛,下面從強到弱解釋下這三句正則的規則,如果有說的不對的地方歡迎大神拍磚,共同學習進步!
強 ==> 密碼長度大于等于8位數 包含大寫字母[A-Z] + 小寫字母[a-z] + 數字[0-9] + 非單詞字符的特殊字符[標點符號,空格啥的這些] 結尾
中 ==> 密碼長度大于等于7位數 大寫字母[A-Z] + 小寫字母[a-z] 或者 大寫字母[A-Z] + 數字[0-9] 或者 小寫字母[a-z] + 數字[0-9] + 任意字符 結尾
弱 ==> 大于等于6位 任何字符或者數字 (如果達不到這個條件就是弱,所以這里需要用false判斷)
原文鏈接:https://www.cnblogs.com/younShieh/p/17082522.html
相關推薦
- 2022-07-13 實現基于 session+redis 的防重復提交
- 2022-04-06 Qt自定義Widget實現互斥效果詳解_C 語言
- 2022-11-05 Golang操作命令行的幾種方式總結_Golang
- 2022-01-12 對比原生Node封裝的Express路由 和 express框架路由
- 2022-03-29 python中的classmethod與staticmethod_python
- 2022-03-24 使用Redis如何設置永久有效_Redis
- 2022-07-01 淺談C語言中的sizeof()和strlen()的區別_C 語言
- 2022-04-30 C語言程序環境中的預處理詳解_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支