iOS12新特性自定义密码自动填充规则

基本概念理解

通过添加自定义限制来修改应用的强密码规则。

虽然自动填充密码生成的强密码安全性已经很好了,但我们的应用可能需要自定义的限制才能与其他技术保持兼容。

遵循UITextInputTraits协议UIKit控件(UITextField、UITextView),通过设置
passwordRules属性或网页中HTML input元素中的passwordrules属性来自定义自动生成的密码的密码规则。

这两个属性的值必须遵循以下形式的相同限制:

required: (<identifier> | <character-class>), ..., (<identifier> | <character-class>); allowed: (<identifier> | <character-class>), ..., (<identifier> | <character-class>); max-consecutive: <non-negative-integer>

使用关键字组合来指定规则:

  • required&allowed关键字:如果所有密码都必须遵循某个限制条件,则使用required关键字; 如果限制条件是指定允许字符的子集,则允许allowed关键字。 如果不包含allowed关键字,则允许使用所有必需字符。 如果包含这两个属性,则允许使用所有允许和必需的字符。 如果两者都未指定,则允许所有ASCII可打印字符
  • 限制条件:可以使用大写(A-Z),小写(a-z),数字(0-9),特殊字符(-〜!@#$%^&* _+=`|(){}[:;“'<>,.?]和空格),ascii-printable(所有ASCII可打印字符)或unicode(所有unicode字符)
  • 最大长度关键字:使用max-consecutive指定密码中连续字符的最大长度。 如果规则中有多个最大连续属性,则将应用属性的最小值。 如果没有此属性,密码可以是任何长度。
  • 自定义字符类:<character-class>是自定义字符类。 此属性包含由方括号括起的ASCII字符列表。 例如,[abc]仅允许字符“a”,“b”和“c”。
  • Non-negative类:<非负整数>是有效的非负整数。 此属性用于指定max-consecutive属性,因为最大长度不能为负。

应用默认密码规则:没有任何自定义的密码规则。 它允许所有ASCII可打印字符,写为allowed:ascii-printable。

可以组合这些关键字来形成规则。 原则上会忽略重复的属性值,空字符类和没有值的属性。 如果使用密码规则,请不要指定pattern属性。 如果您有两个密码字段(一个用于密码,一个用于确认),则当用户输入新密码时,您无需为这两个字段指定密码规则。

Warning
您对密码的限制越多,被攻破的可能性就越高。 最难猜测的密码规则就是allowed:unicode

假如指定的密码长度不能小于12,允许的字符必须至少包含以下两个类:ASCII大写字母,ASCII小写字母和数字。 如果在为UITextField、UITextView设置了密码规则之后,但是密码限制条件不符合这些准则,则用户代理将忽略这些属性。

构建密码规则

例如,假设您要求密码至少包含八个字符,这些字符由大写和小写字母以及至少一个数字和最多两个连续字符组成

let newPasswordTextField = UITextField()
newPasswordTextField.passwordRules = UITextInputPasswordRules(descriptor: "required: upper; required: lower; required: digit; max-consecutive: 2; minlength: 8;")

在上面的前提下变更一下对于数字部分的要求:至少一个数字或一个特殊字符,两者有其一即可

let newPasswordTextField = UITextField()
newPasswordTextField.passwordRules = UITextInputPasswordRules(descriptor: "required: upper; required: lower; required: digit, [-().&@?'#,/&quot;+]; max-consecutive: 2; minlength: 8;") 

至少需要一组特殊字符( - ()。&@?'#,/“+):

let newPasswordTextField = UITextField()
newPasswordTextField.passwordRules = UITextInputPasswordRules(descriptor: "required: upper; required: lower; required: digit; required: [-().&@?'#,/&quot;+]; max-consecutive: 2; minlength: 8;")

或者,要选择允许一个特殊字符

let newPasswordTextField = UITextField()
newPasswordTextField.passwordRules = UITextInputPasswordRules(descriptor: "required: upper; required: lower; required: digit; allowed: [-().&@?'#,/&quot;+]; max-consecutive: 2; minlength: 8;")

另外一个例子是,要允许密码包含任意组合的字母,数字和特殊字符

let newPasswordTextField = UITextField()
newPasswordTextField.passwordRules = UITextInputPasswordRules(descriptor: "allowed: upper, lower, digit, [-().&@?’#,/&quot;+]; minlength: 8;")

指定多个字符类相当于指定一个字符类,该字符类表示所有字符类中字符的并集。

这种等效性的例外是必需的。 密码必须在每个指定的必需属性中包含至少一个字符。 例如:

allowed: upper; allowed: lower <=> allowed: upper, lower
required: upper; required: lower <=> required: upper; required: lower

完整事例

UITextField *field = [[UITextField alloc] initWithFrame:CGRectMake(100, 30, 200, 50)];
field.textColor = [UIColor blackColor];
field.backgroundColor = [UIColor yellowColor];
field.secureTextEntry = YES;
if (@available(iOS 12.0, *)) {
    field.textContentType = UITextContentTypeNewPassword;
    UITextInputPasswordRules *passwordRules = [UITextInputPasswordRules passwordRulesWithDescriptor:@"required: upper; required: lower; required: digit; max-consecutive: 2; minlength: 8;"];
    field.passwordRules = passwordRules;
} else {
    // Fallback on earlier versions
    field.textContentType = UITextContentTypePassword;
}
[self.view addSubview:field];

passwordRules属性用于传达服务密码的要求,以确保iOS可以为用户生成兼容的密码。 它仅在secureTextEntry为YES时有效。 如果iOS生成的密码已与您的服务兼容,则无需使用此属性。 您可以在“密码规则”文档指南中了解有关这些规则的用途和语法的更多信息。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,256评论 0 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,358评论 1 92
  • 一些原因,自己又重装了idea打开后,配置界面变化很多下面是出现的问题,不定时归纳一下: 1 不能用 ctrl+c...
    dodo_lihao阅读 635评论 0 0
  • 当管理员昨日发布最后一次作业的信息时,才恍然发现,不知不觉又坚持了三十天。 第十八期的写作训练营,又接近了尾声。记...
    风儿轻轻阅读 416评论 2 8