版本记录
版本号 | 时间 |
---|---|
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 file
和app ID
。
您现在应该能够在左侧的Project navigator
中看到UltraMotivator.entitlements
。 此entitlements file
包含您刚输入的数据,包含在属性列表中。
iOS
使用此Entitlements File来检查您的code-signing identity
和provisioning profile
。
返回Target ▸ Capabilities
,找到Autofill Credential Provider
,并将其切换为ON
。
再次出现复选标记 - 这次,确认您已将自动填充凭据提供程序功能添加到App ID
和entitlements 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 field
的Content 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
,则密码只能包含您明确允许的字符。如果您既未指定required
或allowed
,则您的密码可以包含任何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 Field
的Password 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()
}
这是代码的作用:
当用户成功注册时,服务器返回一个token
。 UltraMotivator
的API.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 ID
,Face ID
或device 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应用中注册时保存的相同凭据。
同样,如果您通过Safari
在https://[domain name]/register
注册创建一个新帐户并返回iOS应用程序进行登录,则这些凭据应自动填充。
这是很多工作,但你已经为你的努力取得了很多成就。 您现在已经实现了iOS密码自动填充,生成和同步。 您的应用程序的登录操作现在是安全的,易于使用并直接与您的网站集成关联!
查看WWDC 2017’s Introducing Password AutoFill for Apps video和WWDC 2018’s Automatic Strong Passwords and Security Code AutoFill video,以更广泛地了解您刚刚实现的功能。
后记
本篇讲述了提高用户安全性和体验,感兴趣的给个赞或者关注~~~