密碼強(qiáng)度判斷追他,包括鍵盤排列

前幾天接到一個(gè)密碼強(qiáng)度判斷的需求

● 規(guī)則1:大寫字母坟募,小寫字母、數(shù)字邑狸,特殊字符懈糯,至少包含3種,長度不低于8位
● 規(guī)則2:不可以連續(xù)數(shù)字推溃,至少3位(如:123昂利、321)
● 規(guī)則3:不可以連續(xù)字母,至少3位(如:ABC铁坎、abc)
● 規(guī)則4:不可以連續(xù)鍵盤蜂奸,至少3位(如QAZ、qaz)
● 規(guī)則5:不可用Jianshu1到Jianshu9硬萍;Ios1到Ios19
● 規(guī)則6:不能包含連續(xù)3位及以上相同字母或數(shù)字

其中規(guī)則1和規(guī)則6還是比較常見的扩所,規(guī)則2和規(guī)則3也有很多,規(guī)則4倒是第一次遇到朴乖,一開始挺頭疼的祖屏。規(guī)則5可以結(jié)合正則表達(dá)式解決助赞。不廢話了,直接看解決方法袁勺。

規(guī)則1:大寫字母雹食,小寫字母、數(shù)字期丰,特殊字符群叶,至少包含3種,長度不低于8位

NSString * strongPassword = @"^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]{8,}$";
+ (BOOL) isString:(NSString *) str matchWith:(NSString *) regex {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    BOOL isOK = [predicate evaluateWithObject:str];
    return isOK;
}

規(guī)則5:不可用Jianshu1到Jianshu9钝荡;Ios1到Ios19

if (([pwd containsString:@"Jianshu"] && pwd.length == 8) || ([pwd containsString:@"Ios"] && pwd.length == 4)) {

}else if ([pwd containsString:@"Ios1"] && pwd.length == 5){

}
NSString *jianPwd = @"^Jianshu[1-9]|Ios[1-9]";
NSString *iosPwd = @"^Ios1[0-9]";
NSString * strongPassword = @"^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![a-z0-9]+$)[a-zA-Z0-9]{8,}$";
+ (BOOL) isString:(NSString *) str matchWith:(NSString *) regex {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    BOOL isOK = [predicate evaluateWithObject:str];
    return isOK;
}

規(guī)則6:不能包含連續(xù)3位及以上相同字母或數(shù)字

//字符串元素連續(xù)三個(gè)及以上相同
+(BOOL )containsThreeConsec:(NSString *)str{
    NSMutableArray *strarr = [NSMutableArray array];
    // 遍歷字符串中的每個(gè)字符
    for (NSUInteger i = 0; i < str.length; i++) {
        // 提取每個(gè)字符并將其添加到數(shù)組中
        NSString *charStr = [NSString stringWithFormat:@"%C", [str characterAtIndex:i]];
        [strarr addObject:charStr];
    }
        
    // 遍歷字符串(除了最后兩個(gè)字符街立,因?yàn)槲覀冃枰獧z查當(dāng)前字符和接下來的兩個(gè)字符)
    for (int i = 0; i < strarr.count - 2; i++) {
        // 檢查當(dāng)前字符是否與接下來的兩個(gè)字符相同
        if ([strarr[i] isEqualToString:strarr[i+1]] && [strarr[i] isEqualToString:strarr[i+2]]) {
            // 如果相同,則返回YES
            return YES;
        }
    }
    // 如果沒有找到三個(gè)連續(xù)重復(fù)的字符埠通,則返回NO
    return NO;
}

規(guī)則2:不可以連續(xù)數(shù)字赎离,至少3位(如:123、321)

規(guī)則3:不可以連續(xù)字母端辱,至少3位(如:ABC梁剔、abc)

規(guī)則4:不可以連續(xù)鍵盤排列,至少3位(如QAZ掠手、qaz)

這是三個(gè)寫在一起了憾朴,統(tǒng)一都轉(zhuǎn)換成ASCII碼來判斷狸捕,區(qū)分大小寫喷鸽,同時(shí)判斷正序和倒序。鍵盤排列還區(qū)分橫豎灸拍。其中鍵盤排列是把每一個(gè)字母都手動(dòng)關(guān)聯(lián)一個(gè)數(shù)字做祝,q為100,同一橫排數(shù)字+1,同一豎排數(shù)字+100鸡岗。

//連續(xù)的數(shù)字或者字母混槐,用ASCII碼值十進(jìn)制判斷
//數(shù)字范圍0-9是48-57,大寫A-Z是65-90轩性,小寫a-z是97-122
//連續(xù)的鍵盤縱橫排列声登,例如qwe.rfv
//filter參數(shù):數(shù)字“num”,字母“char”揣苏,鍵盤排列:“ keyboard”
+(BOOL)containsThreeCoiled:(NSString *)str andFilter:(NSString *)filter{
    // 將字符串轉(zhuǎn)換為數(shù)組
    NSMutableArray *strarr = [NSMutableArray array];
    // 遍歷字符串中的每個(gè)字符
    for (NSUInteger i = 0; i < str.length; i++) {
        // 提取每個(gè)字符并將其添加到數(shù)組中
        NSString *charStr = [NSString stringWithFormat:@"%C", [str characterAtIndex:i]];
        [strarr addObject:charStr];
    }
    
    NSInteger length = strarr.count;
    // 遍歷字符串(除了最后兩個(gè)字符悯嗓,因?yàn)槲覀冃枰獧z查當(dāng)前字符及后續(xù)兩個(gè)字符)
    for (NSInteger i = 0; i < length - 2; i++) {
        // 檢查當(dāng)前字符及其后續(xù)兩個(gè)字符是否都是數(shù)字且連續(xù)
        unichar acStr = [strarr[i] characterAtIndex:0];
        unichar bcStr = [strarr[i+1] characterAtIndex:0];
        unichar ccStr = [strarr[i+2] characterAtIndex:0];
        NSInteger ac = [NSNumber numberWithUnsignedChar:acStr].integerValue;
        NSInteger bc = [NSNumber numberWithUnsignedChar:bcStr].integerValue;
        NSInteger cc = [NSNumber numberWithUnsignedChar:ccStr].integerValue;
        //判斷是否是數(shù)字或者大小寫字母
        if ([filter isEqualToString:@"num"]) {  //數(shù)字判斷
            if ((ac >= 48 && ac <= 57)) {
                if ((bc >= 48 && bc <= 57)) {
                    if ((cc >= 48 && cc <= 57)) {
                        if (( bc-1 == ac && ac == cc-2)) {  //判斷遞增
                            return YES;
                        }else if (bc+1 == ac && ac == cc+2) {   //判斷遞減
                            return YES;
                        }
                    }
                }
            }
        }else{  //字母判斷
            if ((ac >= 65 && ac <= 90) || (ac >= 97 && ac <= 122)) {
                if ((bc >= 65 && bc <= 90) || (bc >= 97 && bc <= 122)) {
                    if ((cc >= 65 && cc <= 90) || (cc >= 97 && cc <= 122)) {
                        if ([filter isEqualToString:@"keyboard"]) {//是否是連續(xù)鍵盤排列
                            //獲取字母在鍵盤排列所關(guān)聯(lián)的數(shù)字
                            NSInteger acASCIINum = [self getKeyboardRangeNum:ac];
                            NSInteger bcASCIINum = [self getKeyboardRangeNum:bc];
                            NSInteger ccASCIINum = [self getKeyboardRangeNum:cc];
                            if (( bcASCIINum-1 == acASCIINum && acASCIINum == ccASCIINum-2)) {  //橫向判斷遞增
                                return YES;
                            }else if (bcASCIINum+1 == acASCIINum && acASCIINum == ccASCIINum+2) {   //橫向判斷遞減
                                return YES;
                            }else if (( bcASCIINum-100 == acASCIINum && acASCIINum == ccASCIINum-200)) {  //縱向判斷遞增
                                return YES;
                            }else if (bcASCIINum+100 == acASCIINum && acASCIINum == ccASCIINum+200) {   //縱向判斷遞減
                                return YES;
                            }
                        }else{  //是否是連續(xù)字母
                            if (( bc-1 == ac && ac == cc-2)) {  //判斷遞增
                                return YES;
                            }else if (bc+1 == ac && ac == cc+2) {   //判斷遞減
                                return YES;
                            }
                        }
                    }
                }
            }
        }
    }
    // 如果沒有找到連續(xù)的三位或更多位數(shù)字或字母,則返回NO
    return NO;
}

+(NSInteger )getKeyboardRangeNum:(NSInteger )ASCIINum{
    
    if (ASCIINum == 81 || ASCIINum == 113) { //q
        return 100;
    }
    if (ASCIINum == 87 || ASCIINum == 119) {    //w
        return 101;
    }
    if (ASCIINum == 69 || ASCIINum == 101) {    //e
        return 102;
    }
    if (ASCIINum == 82 || ASCIINum == 114) {    //r
        return 103;
    }
    if (ASCIINum == 84 || ASCIINum == 116) {    //t
        return 104;
    }
    if (ASCIINum == 89 || ASCIINum == 121) {    //y
        return 105;
    }
    if (ASCIINum == 85 || ASCIINum == 117) {    //u
        return 106;
    }
    if (ASCIINum == 73 || ASCIINum == 105) {    //i
        return 107;
    }
    if (ASCIINum == 79 || ASCIINum == 111) {    //o
        return 108;
    }
    if (ASCIINum == 80 || ASCIINum == 112) {    //p
        return 109;
    }
    
    if (ASCIINum == 65 || ASCIINum == 97) {    //a
        return 200;
    }
    if (ASCIINum == 83 || ASCIINum == 115) {    //s
        return 201;
    }
    if (ASCIINum == 68 || ASCIINum == 100) {    //d
        return 202;
    }
    if (ASCIINum == 70 || ASCIINum == 102) {    //f
        return 203;
    }
    if (ASCIINum == 71 || ASCIINum == 103) {    //g
        return 204;
    }
    if (ASCIINum == 72 || ASCIINum == 104) {    //h
        return 205;
    }
    if (ASCIINum == 74 || ASCIINum == 106) {    //j
        return 206;
    }
    if (ASCIINum == 75 || ASCIINum == 107) {    //k
        return 207;
    }
    if (ASCIINum == 76 || ASCIINum == 108) {    //l
        return 208;
    }
    
    if (ASCIINum == 90 || ASCIINum == 122) {    //z
        return 300;
    }
    if (ASCIINum == 88 || ASCIINum == 120) {    //x
        return 301;
    }
    if (ASCIINum == 67 || ASCIINum == 99) {    //c
        return 302;
    }
    if (ASCIINum == 86 || ASCIINum == 118) {    //v
        return 303;
    }
    if (ASCIINum == 66 || ASCIINum == 98) {    //b
        return 304;
    }
    if (ASCIINum == 78 || ASCIINum == 110) {    //n
        return 305;
    }
    if (ASCIINum == 77 || ASCIINum == 109) {    //m
        return 306;
    }
    return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卸察,一起剝皮案震驚了整個(gè)濱河市脯厨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坑质,老刑警劉巖合武,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件临梗,死亡現(xiàn)場離奇詭異,居然都是意外死亡稼跳,警方通過查閱死者的電腦和手機(jī)盟庞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汤善,“玉大人茫经,你說我怎么就攤上這事∥颍” “怎么了卸伞?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锉屈。 經(jīng)常有香客問我荤傲,道長,這世上最難降的妖魔是什么颈渊? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任遂黍,我火速辦了婚禮,結(jié)果婚禮上俊嗽,老公的妹妹穿的比我還像新娘雾家。我一直安慰自己,他們只是感情好绍豁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布芯咧。 她就那樣靜靜地躺著,像睡著了一般竹揍。 火紅的嫁衣襯著肌膚如雪敬飒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天芬位,我揣著相機(jī)與錄音无拗,去河邊找鬼。 笑死昧碉,一個(gè)胖子當(dāng)著我的面吹牛英染,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播被饿,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼四康,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了锹漱?” 一聲冷哼從身側(cè)響起箭养,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哥牍,沒想到半個(gè)月后毕泌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喝检,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年撼泛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挠说。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡愿题,死狀恐怖损俭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情潘酗,我是刑警寧澤杆兵,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站仔夺,受9級(jí)特大地震影響琐脏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缸兔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一日裙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惰蜜,春花似錦昂拂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至樟结,卻和暖如春养交,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓢宦。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灰羽,地道東北人驮履。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像廉嚼,于是被迫代替她去往敵國和親玫镐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容