APP安全机制(十二)—— 密码工具:提高用户安全性和体验(二)

版本记录

版本号 时间
V1.0 2018.12.01 星期六

前言

在这个信息爆炸的年代,特别是一些敏感的行业,比如金融业和银行卡相关等等,这都对app的安全机制有更高的需求,很多大公司都有安全 部门,用于检测自己产品的安全性,但是及时是这样,安全问题仍然被不断曝出,接下来几篇我们主要说一下app的安全机制。感兴趣的看我上面几篇。
1. APP安全机制(一)—— 几种和安全性有关的情况
2. APP安全机制(二)—— 使用Reveal查看任意APP的UI
3. APP安全机制(三)—— Base64加密
4. APP安全机制(四)—— MD5加密
5. APP安全机制(五)—— 对称加密
6. APP安全机制(六)—— 非对称加密
7. APP安全机制(七)—— SHA加密
8. APP安全机制(八)—— 偏好设置的加密存储
9. APP安全机制(九)—— 基本iOS安全之钥匙链和哈希(一)
10. APP安全机制(十)—— 基本iOS安全之钥匙链和哈希(二)
11. APP安全机制(十一)—— 密码工具:提高用户安全性和体验(一)

Completing the Two-Way Association - 完成双方的关联

好吧,现在,是时候配置您的iOS应用程序来识别您的网站,从而完成双向关联。 在继续之前,请在浏览器的位置栏中记下您的Heroku app domain,稍后您将需要它。

在Xcode中打开UltraMotivator,在左侧Project导航器的顶部选择目标,然后单击General选项卡。

Identity部分中,将Bundle Identifier设置为您的App ID。 在Signing部分,选中Automatically manage signing,然后选择与应用程序关联的Team:Xcode现在应生成配置文件和签名证书。 您的General页面上的任何错误现在都应该消失。

在页面底部,将AuthenticationServices.framework添加到Linked Frameworks and Libraries。 您需要AuthenticationServices来集成iOS密码自动填充功能。

接下来,单击Capabilities选项卡。 找到Associated Domains的选项并将其设置为ON以激活此功能。

现在,单击+,然后使用以下格式将Heroku应用程序的域添加到列表中:

webcredentials:[your domain]

假设您已正确设置App ID’s capabilities,请在列出的域下方显示带有复选标记的标签。 这些复选标记表示您已将相关的域功能添加到您的entitlement fileapp ID

您现在应该能够在左侧的Project navigator中看到UltraMotivator.entitlements。 此entitlements file包含您刚输入的数据,包含在属性列表中。

iOS使用此Entitlements File来检查您的code-signing identityprovisioning profile

返回Target ▸ Capabilities,找到Autofill Credential Provider,并将其切换为ON

再次出现复选标记 - 这次,确认您已将自动填充凭据提供程序功能添加到App IDentitlements file.中。 它还确认您已包含AuthenticationServices.framework


Putting It All Together

现在是时候把所有东西都连接起来了。

返回Xcode中的UltraMotivator.xcodeproj,打开API.swift并在第46行找到以下代码:

static let baseURL = URL(string: "https://[your domain]")

“[your domain]”替换为您之前复制和使用的Heroku应用程序名称。

注意:使用Heroku时,您的域名可能会遵循[your app name].herokuapp.com

API.swift包含能够与您域中的服务器应用程序通信的API调用。 这些调用有助于执行用户登录,注册,注销,密码更改和随机激励生成。 大多数这些调用已经集成到iOS应用程序中。 现在您已添加了域,身份验证应按预期工作。

接下来,您将在Interface Builder中添加iOS密码自动填充,强密码生成和安全代码自动填充。 打开Main.storyboard即可开始使用。

Login view controller上选择Username field。 在右侧Inspector窗格中打开Attributes inspector选项卡。 找到Text Input Traits部分,并将Content Type设置为Username

现在,选择Password field并将其Content Type设置为Password

同样,在Signup view controller上,将Username field’s Content Type更改为Username。 然后,将New Password fieldContent Type更改为New Password,以便此字段现在将自动填充强密码建议。

最后,打开OneTimeCodeViewController.swift。 在第42行插入以下内容:

oneTimeCodeField.textContentType = .oneTimeCode

通过将textContentType设置为.oneTimeCode,每当iOS在用户正在查看此双因素身份验证屏幕时检测到传入邮件中的安全代码时,键盘上方的QuickType栏将自动填充代码。 然后,用户只需点击一下即可输入此代码,而无需离开应用程序。


Customizing iOS Password AutoFill Rules - 自定义iOS密码自动填充规则

在进行最后的步骤之前,您需要最后快速绕道以了解iOS密码自动填充规则。

Apple的默认密码长度为20个字符,并且必须包含以下所有字符类型:大写,小写,数字和连字符。 这会生成一个与大多数Web服务兼容的强密码。

但是,在某些情况下,您可能需要或想要为建议的iOS密码设置自定义规则。 您可以将这些自定义规则添加到Content Type设置为New Password的任何字段的Password Rule属性中。

iOS密码自动填充规则需要以下格式:

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

他们使用以下关键字:

  • required:如果生成的密码必须至少包含指定字符类的一个成员,请使用“required”。要组合字符类,请用逗号分隔它们。例如,required:X,Y等于required:[XY],其中X和Y表示字符类。
  • allowed:如果限制指定允许字符的子集,则使用“allowed”。如果您不包含allowed属性,并且只包含required,则密码只能包含所需的字符。如果您只指定allowed而不是required,则密码只能包含您明确允许的字符。如果您既未指定requiredallowed,则您的密码可以包含任何ASCII可打印字符。
  • max-consecutive:使用正整数跟随“max-consecutive”以限制字符连续出现的次数。
  • minlength:使用带有正整数的“minlength”关键字指定最小密码长度。
  • maxlength:使用带有正整数的“maxlength”关键字来指定最大密码长度。

您必须使用“allowed”“required”以及这些允许的字符类:

  • upper:表示大写字母A - Z
  • lower:表示小写字母a - z
  • digit:表示数字0 - 9
  • special:包括- ().&@?'#,/“+和空格。
  • ascii-printable:包含所有ASCII字符。
  • unicode:包含所有unicode字符。
  • 或者通过列出要包含在方括号中的ASCII字符来指定自定义字符类。例如,“ allowed:[a1, - ]”允许字符“a”,“1”,“,”“ - ”

A Super Fun Happy Quiz? Oh, Boy!!

认为你得到了要点? 请尝试以下练习。 对于每个密码规则,确定密码自动填充是否可以生成A,B,C和/或D。每个答案可能包含以下所有多项选项:

1. required: upper, digit; maxlength: 5; max-consecutive: 1;
A. JEMSP
B. 43jKL
C. 39LS2
D. 92JJK

Password rule #1 can generate passwords A and C.

2. required: lower; required: digit, [$#@]; allowed: upper; minlength: 9; max-consecutive: 2;
A. jsoeebd1re
B. Ys2jUJaaauREV
C. js13&Lk2ja
D. 29mn$#ki@nd

Password rule #2 can generate passwords A and D.

3. required: lower, special; required: digit, upper; allowed: unicode;
A. I❤️U
B. aJEK24
C. 30 👩‍💻3420
D. 3 0 4 2

Password rule #3 can generate passwords B, C and D.

恭喜你完成这项运动! 据说,根据Apple的说法:

The more restrictions you have on a password, the higher the likelihood that it can be guessed. The hardest-to-guess password rule is allowed: unicode. No password rule at all creates the second most-difficult-to-guess passwords.

您对密码的限制越多,猜测的可能性就越高。 允许使用最难猜测的密码规则:unicode。 没有密码规则会创建第二个最难猜测的密码。

那么请记住那些经过精心分析的复杂密码规则吗? 作为一般规则,你通常希望尽可能避免它们!


Putting Custom Password Rules to Use

每当您与后端Web服务集成时,您可能需要使用iOS密码规则来同步服务可能强加的任何特定密码要求。

为了测试,想象一下你的网络后端:

  • 1) 不接受特殊字符。
  • 2) 需要至少12个字符长。
  • 3) 需要大写字符。

要满足这些要求,请打开Main.storyboard,在Signup View Controller Scene中选择New Password字段,然后将此密码规则复制并粘贴到New Password FieldPassword Rule的field中:

required: upper;
allowed: lower, digit;
minlength: 12; 
maxlength: 20;
max-consecutive: 3;

此规则至少需要一个大写字符;它还允许使用小写字符和数字;它生成一个12到20个字符长的密码,它可以防止任何字符连续出现三次以上。

当您继续实施自己的iOS密码自动填充规则时,您可以通过将其输入Apple’s Password Rules Validation Tool来确认它们是否按预期工作。在那里,您可以查看几百甚至一万个生成的密码,以确保您的规则产生您需要的结果。


Taking It for a Spin

您现在已经设置了身份验证,强密码自动填充,安全代码自动填充和自定义iOS密码规则。构建并运行您的iOS应用程序以在物理iOS设备上测试所有内容 - iOS密码自动填充功能无法在模拟器上运行。

点击登录页面右下角的Sign Up以导航到注册视图。

用户名字Field的Keyboard Type“E-mail Address”,因此,虽然用户名字段是第一个响应者,但·QuickType·栏可能会建议您用于登录其他服务的电子邮件地址。这是因为iOS将此特定用户名字Field识别为注册用户名字Field。

输入用户名后,选择Password field。它应该使用符合您在field’s Password Rule中指定的规则的强密码自动填充。点击Use Strong Password以使用自动填充提供的建议,然后点击Sign Up。如果您已成功注册,将弹出一条警告以通知您。

如果您看到上述alert,恭喜! 您已注册一个新帐户。 点击OK,注册视图将自动关闭以返回登录视图。


Saving Your Passwords

最后一个难题是:自动保存新创建的凭据。 事实证明,要让iOS识别出需要保存一组新凭据,您必须:

  • 1) 在注册发生后,从View层次结构中删除Username and Password fields
  • 2) 仅在Username and Password fields不再位于“视图”层次结构中后清除它们。

由于您的应用完全取消了注册视图而未删除任何fields,因此它已满足这些要求。 很好! 但是,如何防止您的钥匙串保存失败或不完整登录尝试的凭据? 好问题!

打开SignupViewController.swift,向下滚动到viewWillDisappear(_ :)并找到此代码片段:

if API.token == nil {
  usernameField.text = nil
  passwordField.text = nil
} else {
  API.logout()
}

这是代码的作用:

当用户成功注册时,服务器返回一个tokenUltraMotivatorAPI.swift类将它存储在变量API.token中。

如果用户导航回登录视图时API.token为nil,则注册操作未完成。 在这种情况下,您在离开View层次结构之前将text field设置为nil,即在viewWillDisappear(_ :)中。 这可以防止将这些无效凭据保存到用户的钥匙串中。

如果API.token不是nil,则注册操作已成功完成。 在这种情况下,您log out,保持fields的文本不变。 然后,iOS会自动将这些凭据保存到用户的钥匙串中。


Checking Under the Hood

要确认您的iOS密码规则是否有效,请在iOS设备(而非模拟器)上运行该应用,然后使用几个不同的用户名进行注册。 在Mac上打开Keychain Access。 选择登login钥链,Passwords类别,然后搜索您的Web应用程序域的登录密码。

要查看与列出的用户名关联的任何密码,请选择该密码,然后点击show password复选框。 出现提示时输入您的钥匙串/计算机密码,密码应该出现。

根据我的钥匙串,我的用户名的相应密码是“rehnep0xasravezpUg”“Qyddehziwzek2syhda”“Qyddehziwzek2syhda.”所有这三个都符合为应用程序定义的自定义密码规则。

要确认凭据何时不保存,请输入用户名和密码,但不注册即按“返回”按钮。 再次检查Keychain Access的登录密码以确认iOS未将这些无效凭证保存到钥匙串。

一旦您对您的凭据按预期保存感到满意,请返回到您的iOS设备并尝试登录该应用。 开始输入您的用户名。 您的用户名应自动显示在QuickType栏中,或者在您点击右侧的键符号后显示。 选择您的用户名,并在出现提示时使用Touch IDFace IDdevice passcode验证您的钥匙串访问权限。 您的iOS密码和用户名将相应地自动填充。

提交这些凭据,您现在应该看到一个两步验证屏幕:

由于未在后端设置两步验证,因此不要等待代码自动通过:您必须手动测试此功能。

要确定文本消息是否包含安全代码,iOS会使用代码字符串扫描传入文本中的 “code” or “passcode”等字词。 因此,要测试此功能,请保持Ultra Motivator打开并通过Apple的桌面Messages应用程序自行发送文本。 给自己发一个代码:“Your code is 1234.”。然后,QuickType栏会向你显示在代码字段中自动填充“1234”的选项。

注意:iOS可以识别所有支持的iOS语言中与“code” or “passcode”等效的单词。

点按Submit以显示Motivational view controller


Password Ninja Enlightenment Attained!

祝贺你! 你是一个真正的忍者密码战士。

花点时间深入了解随机动机,然后在iOS设备上打开Safari。 通过在以下网址中将“[your domain]”替换为您的实际域,导航到您的登录网页:

https://[domain name]/login

点击Username field后,您的网页应显示您在iOS应用中注册时保存的相同凭据。

同样,如果您通过Safarihttps://[domain name]/register注册创建一个新帐户并返回iOS应用程序进行登录,则这些凭据应自动填充。

这是很多工作,但你已经为你的努力取得了很多成就。 您现在已经实现了iOS密码自动填充,生成和同步。 您的应用程序的登录操作现在是安全的,易于使用并直接与您的网站集成关联!

查看WWDC 2017’s Introducing Password AutoFill for Apps videoWWDC 2018’s Automatic Strong Passwords and Security Code AutoFill video,以更广泛地了解您刚刚实现的功能。

后记

本篇讲述了提高用户安全性和体验,感兴趣的给个赞或者关注~~~

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

推荐阅读更多精彩内容