☰
如何做 Navajo 密码验证:从熵值打分到自定义规则写法
2026/10/19 1:25:44 网站建设 项目流程

如何做 Navajo 密码验证:从熵值打分到自定义规则写法

【免费下载链接】claude-code-hooks-masteryMaster Claude Code Hooks项目地址: https://gitcode.com/GitHub_Trending/cl/claude-code-hooks-mastery

Navajo 是一个用 ObjC 编写的密码验证与强度评估库,内置长度、字符类型、字典词等校验规则,并提供基于信息熵的强度评分器。做 iOS 密码策略配置时真正要回答的问题是四件事:强度提示怎么给用户看、常见校验怎么快速拼出来、业务特有的检查怎么写成规则、验证结果拿回来后怎么展示。

用熵值做密码强度评估:怎么给用户显示强度反馈

注册表单上用户输入密码时,通常要配一个"弱 / 中 / 强"的实时提示。Navajo 用信息熵来量化密码"有多难猜":熵衡量的是不确定性,字符池越宽(小写、大写、数字、符号都算进来)、密码越长、字符分布越不规律,可能的组合越多,熵就越高。"abcd" 这种纯字母短密码穷举空间只有几百万种,熵很低;混用四种字符集、长度 12 位以上时,组合数已经是天文数字。

NJOPasswordStrengthEvaluator 把熵值映射成五个强度等级,阈值如下:

  • 熵值低于 28 位:非常弱
  • 28 到 35 位:弱
  • 36 到 59 位:合理
  • 60 到 127 位:强
  • 128 位及以上:非常强

这些位数对应的是穷举搜索空间的大小:28 位不到 3 亿种可能,对暴力破解来说几乎零成本;60 位以上则超出了常规攻击预算,对大多数业务足够安全。用法上,调用 +strengthOfPassword: 得到强度等级,再调用 +localizedStringForPasswordStrength: 就能拿到可直接上屏的本地化文案,不用自己维护一套等级到文案的映射表。

用内置规则快速拼常见校验:长度、字符类型与字典词

注册场景最常见的诉求就是"长度 8 到 20、大小写、数字、符号各至少一个",Navajo 的内置规则正好覆盖这些:

  • NJOLengthRule 通过 +ruleWithRange: 创建,传入一个 NSRange 即可限定长度区间,例如[NJOLengthRule ruleWithRange:NSMakeRange(8, 20)];
  • NJORequiredCharacterRule 为小写、大写、数字、符号各提供一条 class method,如 lowercaseCharacterRequiredRule、symbolCharacterRequiredRule,保证对应字符类型至少出现一次;
  • NJODictionaryWordRule 拦截常见字典词,防止 "password123" 这类密码直接过审;
  • NJOAllowedCharacterRule 把密码限制在指定字符集内,适合后端只接受有限字符的情况。

每条规则都是独立对象,单独创建、单独持有,下一节会讲怎么把它们装进一个完整策略。

Navajo 自定义密码规则:正则、谓词、代码块三种写法

内置规则覆盖不了业务检查时——"密码不能等于用户名"、"不能出现三连重复字符"——Navajo 给了三种自定义路径,表达力依次递增。

正则表达式规则:用 NJORegularExpressionRule 描述固定模式

+ruleWithRegularExpression: 接收一个 NSRegularExpression,任何模式都能变成一条规则。比如模式([a-zA-Z0-9])\1{2,}匹配同一字符连续出现三次以上,能拦下 "aaab123"、"x111y" 这类输入。模式型检查用正则写最省,规则不依赖运行上下文,可以在多处策略里复用。

谓词规则:用 NJOPredicateRule 表达布尔条件

有些判断用正则写出来可读性很差,换成 NSPredicate 就直白了,比如"密码必须包含偶数个数字"。+ruleWithPredicate: 把条件封装成规则对象,判断逻辑集中在谓词里,不散落在控制器代码中。

代码块规则:用 NJOBlockRule 直接写业务判断

当检查需要引用运行时状态——比如当前登录用户名——代码块最直接。+ruleWithBlock: 接收一个 BOOL(NSString *password) 的 block,返回 YES 表示通过:

NJOBlockRule *usernameRule = [NJOBlockRule ruleWithBlock:^BOOL(NSString *password) { return ![password containsString:username]; }];

这条规则只要求密码不包含用户名。block 里可以访问任何在作用域内的变量,是三种写法里上限最高的,也适合作为业务兜底。

把规则拼成验证器:Navajo 密码验证策略的组合与结果获取

单条规则只是策略的一小段。把 N 条规则装进数组,传给 [NJOPasswordValidator validatorWithRules:],就得到一个完整验证器。没有特殊要求时,直接用 NJOPasswordValidator.standardValidator 拿到的标准验证器即可,它目前只有一条长度规则,要求密码 6 到 64 个字符。

验证时调用 -validatePassword:failingRules:,返回整体是否通过,并通过指针带回失败的规则列表:

NJOPasswordValidator *validator = [NJOPasswordValidator validatorWithRules:rules]; NSArray *failingRules; BOOL isValid = [validator validatePassword:password failingRules:&failingRules];

不通过时遍历 failingRules,取每条规则的 localizedErrorDescription,就是可直接展示的错误文案,比如"至少包含一个数字"。错误文案挂在规则本身上,业务侧不需要再维护一份错误码表。

怎么把 Navajo 接进项目

集成不复杂:Navajo 以源码形式提供,把它的头文件和实现文件加入工程参与编译即可,也可以用 CocoaPods 集成。注册流程里常见的接法是:输入变化时先跑 validatePassword:failingRules:,不通过就逐条展示失败规则的错误文案,同时用 +strengthOfPassword: 实时刷新强度标签。

如果你的注册表单只有邮箱加密码,标准验证器加一条长度规则通常就够;有安全合规要求时,再补上字典词规则和用户名拦截规则,强度提示交给熵值评分即可。

【免费下载链接】claude-code-hooks-masteryMaster Claude Code Hooks项目地址: https://gitcode.com/GitHub_Trending/cl/claude-code-hooks-mastery

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询