首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 密碼強度驗證:拒絕連續字元序列(1234, abcd 等)

     編輯:程式設計綜合問答

需求分析

驗證密碼不包含連續遞增/遞減字元序列(如 1234、abcd、4321、dcba),允許無序字元(1326、dies)。

解決策略:黑名單模式匹配

方法一:預定義禁用序列集合


// 預生成所有長度>=4 的連續序列
static let forbiddenSequences: Set = {
    var set = Set()
    // 數字 0-9
    for i in 0...6 {  // 0123, 1234, ..., 6789
        let seq = String((i...i+3).map { String($0) }.joined())
        set.insert(seq)
        set.insert(String(seq.reversed()))  // 遞減
    }
    // 小寫字母 a-z
    for i in 0...22 {
        let seq = String((i...i+3).map { Character(UnicodeScalar(97+$0)!) }.map(String.init).joined())
        set.insert(seq)
        set.insert(String(seq.reversed()))
    }
    // 大寫字母 A-Z
    for i in 0...22 {
        let seq = String((i...i+3).map { Character(UnicodeScalar(65+$0)!) }.map(String.init).joined())
        set.insert(seq)
        set.insert(String(seq.reversed()))
    }
    return set
}()

func isPasswordValid(_ password: String) -> Bool {
    // 檢查所有子字串長度>=4
    for len in 4...password.count {
        for i in 0...(password.count - len) {
            let sub = String(password.dropFirst(i).prefix(len))
            if forbiddenSequences.contains(sub) { return false }
        }
    }
    return true
}

方法二:動態檢測連續字元碼


func hasSequentialChars(_ password: String, minLength: Int = 4) -> Bool {
    let chars = Array(password.unicodeScalars.map { Int($0.value) })
    guard chars.count >= minLength else { return false }
    
    var incCount = 1, decCount = 1
    for i in 1..= minLength || decCount >= minLength { return true }
    }
    return false
}

func isPasswordValid(_ password: String) -> Bool {
    return !hasSequentialChars(password)
}

優勢:無需預生成表、支援任意 Unicode 連續字元、O(n) 時間複雜度。

完整密碼策略建議

  1. 長度 ≥ 8
  2. 包含大小寫、數字、特殊字元(至少三類)
  3. 拒絕常見弱密碼(字典、鍵盤走勢、連續序列、重複字元)
  4. 檢查資料外洩庫(HaveIBeenPwned API)
  5. 不限制最大長度、允許貼上、顯示/隱藏切換

iOS 內建支援


// iOS 12+ 密碼自動強度建議
textField.passwordRules = UITextInputPasswordRules(descriptor: "required: upper; required: lower; required: digit; required: special; minlength: 8;")
// 系統鍵盤會提示生成強密碼

密碼驗證核心:黑名單攔截已知弱模式 + 白名單鼓勵高熵值,動態檢測連續字元碼比預生成表更通用高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved