版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2018.12.01 星期六 |
前言
在這個信息爆炸的年代,特別是一些敏感的行業(yè),比如金融業(yè)和銀行卡相關(guān)等等,這都對
app
的安全機制有更高的需求,很多大公司都有安全 部門,用于檢測自己產(chǎn)品的安全性,但是及時是這樣,安全問題仍然被不斷曝出,接下來幾篇我們主要說一下app
的安全機制。感興趣的看我上面幾篇。
1. APP安全機制(一)—— 幾種和安全性有關(guān)的情況
2. APP安全機制(二)—— 使用Reveal查看任意APP的UI
3. APP安全機制(三)—— Base64加密
4. APP安全機制(四)—— MD5加密
5. APP安全機制(五)—— 對稱加密
6. APP安全機制(六)—— 非對稱加密
7. APP安全機制(七)—— SHA加密
8. APP安全機制(八)—— 偏好設(shè)置的加密存儲
9. APP安全機制(九)—— 基本iOS安全之鑰匙鏈和哈希(一)
10. APP安全機制(十)—— 基本iOS安全之鑰匙鏈和哈希(二)
11. APP安全機制(十一)—— 密碼工具:提高用戶安全性和體驗(一)
Completing the Two-Way Association - 完成雙方的關(guān)聯(lián)
好吧,現(xiàn)在,是時候配置您的iOS應(yīng)用程序來識別您的網(wǎng)站,從而完成雙向關(guān)聯(lián)。 在繼續(xù)之前,請在瀏覽器的位置欄中記下您的Heroku app domain
,稍后您將需要它。
在Xcode中打開UltraMotivator
,在左側(cè)Project導(dǎo)航器的頂部選擇目標(biāo),然后單擊General
選項卡。
在Identity
部分中,將Bundle Identifier
設(shè)置為您的App ID
。 在Signing
部分,選中Automatically manage signing
,然后選擇與應(yīng)用程序關(guān)聯(lián)的Team
:Xcode現(xiàn)在應(yīng)生成配置文件和簽名證書。 您的General
頁面上的任何錯誤現(xiàn)在都應(yīng)該消失。
在頁面底部,將AuthenticationServices.framework
添加到Linked Frameworks and Libraries
。 您需要AuthenticationServices
來集成iOS密碼自動填充功能。
接下來,單擊Capabilities
選項卡。 找到Associated Domains
的選項并將其設(shè)置為ON
以激活此功能。
現(xiàn)在,單擊+
,然后使用以下格式將Heroku
應(yīng)用程序的域添加到列表中:
webcredentials:[your domain]
假設(shè)您已正確設(shè)置App ID’s capabilities
,請在列出的域下方顯示帶有復(fù)選標(biāo)記的標(biāo)簽。 這些復(fù)選標(biāo)記表示您已將相關(guān)的域功能添加到您的entitlement file
和app ID
。
您現(xiàn)在應(yīng)該能夠在左側(cè)的Project navigator
中看到UltraMotivator.entitlements
。 此entitlements file
包含您剛輸入的數(shù)據(jù),包含在屬性列表中。
iOS
使用此Entitlements File來檢查您的code-signing identity
和provisioning profile
。
返回Target ? Capabilities
,找到Autofill Credential Provider
,并將其切換為ON
。
再次出現(xiàn)復(fù)選標(biāo)記 - 這次,確認您已將自動填充憑據(jù)提供程序功能添加到App ID
和entitlements file.
中。 它還確認您已包含AuthenticationServices.framework
。
Putting It All Together
現(xiàn)在是時候把所有東西都連接起來了。
返回Xcode中的UltraMotivator.xcodeproj
,打開API.swift
并在第46行找到以下代碼:
static let baseURL = URL(string: "https://[your domain]")
將“[your domain]”
替換為您之前復(fù)制和使用的Heroku
應(yīng)用程序名稱。
注意:使用
Heroku
時,您的域名可能會遵循[your app name].herokuapp.com
。
API.swift
包含能夠與您域中的服務(wù)器應(yīng)用程序通信的API調(diào)用。 這些調(diào)用有助于執(zhí)行用戶登錄,注冊,注銷,密碼更改和隨機激勵生成。 大多數(shù)這些調(diào)用已經(jīng)集成到iOS應(yīng)用程序中。 現(xiàn)在您已添加了域,身份驗證應(yīng)按預(yù)期工作。
接下來,您將在Interface Builder
中添加iOS密碼自動填充,強密碼生成和安全代碼自動填充。 打開Main.storyboard
即可開始使用。
在Login view controller
上選擇Username field
。 在右側(cè)Inspector
窗格中打開Attributes inspector
選項卡。 找到Text Input Traits
部分,并將Content Type
設(shè)置為Username
。
現(xiàn)在,選擇Password field
并將其Content Type
設(shè)置為Password
。
同樣,在Signup view controller
上,將Username field’s Content Type
更改為Username
。 然后,將New Password field
的Content Type
更改為New Password
,以便此字段現(xiàn)在將自動填充強密碼建議。
最后,打開OneTimeCodeViewController.swift
。 在第42行插入以下內(nèi)容:
oneTimeCodeField.textContentType = .oneTimeCode
通過將textContentType
設(shè)置為.oneTimeCode
,每當(dāng)iOS在用戶正在查看此雙因素身份驗證屏幕時檢測到傳入郵件中的安全代碼時,鍵盤上方的QuickType
欄將自動填充代碼。 然后,用戶只需點擊一下即可輸入此代碼,而無需離開應(yīng)用程序。
Customizing iOS Password AutoFill Rules - 自定義iOS密碼自動填充規(guī)則
在進行最后的步驟之前,您需要最后快速繞道以了解iOS密碼自動填充規(guī)則。
Apple的默認密碼長度為20個字符,并且必須包含以下所有字符類型:大寫,小寫,數(shù)字和連字符。 這會生成一個與大多數(shù)Web服務(wù)兼容的強密碼。
但是,在某些情況下,您可能需要或想要為建議的iOS密碼設(shè)置自定義規(guī)則。 您可以將這些自定義規(guī)則添加到Content Type
設(shè)置為New Password
的任何字段的Password Rule
屬性中。
iOS密碼自動填充規(guī)則需要以下格式:
required: (<identifier> | <character-class>), ..., (<identifier> | <character-class>);
allowed: (<identifier> | <character-class>), ..., (<identifier> | <character-class>);
max-consecutive: <non-negative-integer>
他們使用以下關(guān)鍵字:
-
required:如果生成的密碼必須至少包含指定字符類的一個成員,請使用
“required”
。要組合字符類,請用逗號分隔它們。例如,required:X,Y
等于required:[XY]
,其中X和Y表示字符類。 -
allowed:如果限制指定允許字符的子集,則使用
“allowed”
。如果您不包含allowed
屬性,并且只包含required
,則密碼只能包含所需的字符。如果您只指定allowed
而不是required
,則密碼只能包含您明確允許的字符。如果您既未指定required
或allowed
,則您的密碼可以包含任何ASCII可打印字符。 -
max-consecutive:使用正整數(shù)跟隨
“max-consecutive”
以限制字符連續(xù)出現(xiàn)的次數(shù)。 -
minlength:使用帶有正整數(shù)的
“minlength”
關(guān)鍵字指定最小密碼長度。 -
maxlength:使用帶有正整數(shù)的
“maxlength”
關(guān)鍵字來指定最大密碼長度。
您必須使用“allowed”
和“required”
以及這些允許的字符類:
-
upper:表示大寫字母
A - Z
-
lower:表示小寫字母
a - z
。 -
digit:表示數(shù)字
0 - 9
。 -
special:包括
- ().&@?'#,/“+
和空格。 - ascii-printable:包含所有ASCII字符。
- unicode:包含所有unicode字符。
- 或者通過列出要包含在方括號中的ASCII字符來指定自定義字符類。例如,
“ allowed:[a1, - ]”
允許字符“a”,“1”,“,”
和“ - ”
。
A Super Fun Happy Quiz? Oh, Boy!!
認為你得到了要點? 請嘗試以下練習(xí)。 對于每個密碼規(guī)則,確定密碼自動填充是否可以生成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.
恭喜你完成這項運動! 據(jù)說,根據(jù)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.
您對密碼的限制越多,猜測的可能性就越高。 允許使用最難猜測的密碼規(guī)則:unicode。 沒有密碼規(guī)則會創(chuàng)建第二個最難猜測的密碼。
那么請記住那些經(jīng)過精心分析的復(fù)雜密碼規(guī)則嗎? 作為一般規(guī)則,你通常希望盡可能避免它們!
Putting Custom Password Rules to Use
每當(dāng)您與后端Web服務(wù)集成時,您可能需要使用iOS密碼規(guī)則來同步服務(wù)可能強加的任何特定密碼要求。
為了測試,想象一下你的網(wǎng)絡(luò)后端:
- 1) 不接受特殊字符。
- 2) 需要至少12個字符長。
- 3) 需要大寫字符。
要滿足這些要求,請打開Main.storyboard
,在Signup View Controller Scene
中選擇New Password
字段,然后將此密碼規(guī)則復(fù)制并粘貼到New Password Field
的Password Rule
的field中:
required: upper;
allowed: lower, digit;
minlength: 12;
maxlength: 20;
max-consecutive: 3;
此規(guī)則至少需要一個大寫字符;它還允許使用小寫字符和數(shù)字;它生成一個12到20個字符長的密碼,它可以防止任何字符連續(xù)出現(xiàn)三次以上。
當(dāng)您繼續(xù)實施自己的iOS密碼自動填充規(guī)則時,您可以通過將其輸入Apple’s Password Rules Validation Tool來確認它們是否按預(yù)期工作。在那里,您可以查看幾百甚至一萬個生成的密碼,以確保您的規(guī)則產(chǎn)生您需要的結(jié)果。
Taking It for a Spin
您現(xiàn)在已經(jīng)設(shè)置了身份驗證,強密碼自動填充,安全代碼自動填充和自定義iOS密碼規(guī)則。構(gòu)建并運行您的iOS應(yīng)用程序以在物理iOS設(shè)備上測試所有內(nèi)容 - iOS密碼自動填充功能無法在模擬器上運行。
點擊登錄頁面右下角的Sign Up
以導(dǎo)航到注冊視圖。
用戶名字Field的Keyboard Type
是“E-mail Address”
,因此,雖然用戶名字段是第一個響應(yīng)者,但·QuickType·欄可能會建議您用于登錄其他服務(wù)的電子郵件地址。這是因為iOS將此特定用戶名字Field識別為注冊用戶名字Field。
輸入用戶名后,選擇Password field
。它應(yīng)該使用符合您在field’s Password Rule
中指定的規(guī)則的強密碼自動填充。點擊Use Strong Password
以使用自動填充提供的建議,然后點擊Sign Up
。如果您已成功注冊,將彈出一條警告以通知您。
如果您看到上述alert
,恭喜! 您已注冊一個新帳戶。 點擊OK
,注冊視圖將自動關(guān)閉以返回登錄視圖。
Saving Your Passwords
最后一個難題是:自動保存新創(chuàng)建的憑據(jù)。 事實證明,要讓iOS識別出需要保存一組新憑據(jù),您必須:
- 1) 在注冊發(fā)生后,從View層次結(jié)構(gòu)中刪除
Username and Password fields
。 - 2) 僅在
Username and Password fields
不再位于“視圖”層次結(jié)構(gòu)中后清除它們。
由于您的應(yīng)用完全取消了注冊視圖而未刪除任何fields
,因此它已滿足這些要求。 很好! 但是,如何防止您的鑰匙串保存失敗或不完整登錄嘗試的憑據(jù)? 好問題!
打開SignupViewController.swift
,向下滾動到viewWillDisappear(_ :)
并找到此代碼片段:
if API.token == nil {
usernameField.text = nil
passwordField.text = nil
} else {
API.logout()
}
這是代碼的作用:
當(dāng)用戶成功注冊時,服務(wù)器返回一個token
。 UltraMotivator
的API.swift
類將它存儲在變量API.token
中。
如果用戶導(dǎo)航回登錄視圖時API.token
為nil,則注冊操作未完成。 在這種情況下,您在離開View層次結(jié)構(gòu)之前將text field
設(shè)置為nil
,即在viewWillDisappear(_ :)
中。 這可以防止將這些無效憑據(jù)保存到用戶的鑰匙串中。
如果API.token
不是nil
,則注冊操作已成功完成。 在這種情況下,您log out
,保持fields
的文本不變。 然后,iOS會自動將這些憑據(jù)保存到用戶的鑰匙串中。
Checking Under the Hood
要確認您的iOS密碼規(guī)則是否有效,請在iOS設(shè)備(而非模擬器)上運行該應(yīng)用,然后使用幾個不同的用戶名進行注冊。 在Mac上打開Keychain Access
。 選擇登login
鑰鏈,Passwords
類別,然后搜索您的Web應(yīng)用程序域的登錄密碼。
要查看與列出的用戶名關(guān)聯(lián)的任何密碼,請選擇該密碼,然后點擊show password
復(fù)選框。 出現(xiàn)提示時輸入您的鑰匙串/計算機密碼,密碼應(yīng)該出現(xiàn)。
根據(jù)我的鑰匙串,我的用戶名的相應(yīng)密碼是“rehnep0xasravezpUg”
,“Qyddehziwzek2syhda”
和“Qyddehziwzek2syhda.”
所有這三個都符合為應(yīng)用程序定義的自定義密碼規(guī)則。
要確認憑據(jù)何時不保存,請輸入用戶名和密碼,但不注冊即按“返回”按鈕。 再次檢查Keychain Access
的登錄密碼以確認iOS未將這些無效憑證保存到鑰匙串。
一旦您對您的憑據(jù)按預(yù)期保存感到滿意,請返回到您的iOS設(shè)備并嘗試登錄該應(yīng)用。 開始輸入您的用戶名。 您的用戶名應(yīng)自動顯示在QuickType
欄中,或者在您點擊右側(cè)的鍵符號后顯示。 選擇您的用戶名,并在出現(xiàn)提示時使用Touch ID
,Face ID
或device passcode
驗證您的鑰匙串訪問權(quán)限。 您的iOS密碼和用戶名將相應(yīng)地自動填充。
提交這些憑據(jù),您現(xiàn)在應(yīng)該看到一個兩步驗證屏幕:
由于未在后端設(shè)置兩步驗證,因此不要等待代碼自動通過:您必須手動測試此功能。
要確定文本消息是否包含安全代碼,iOS會使用代碼字符串掃描傳入文本中的 “code” or “passcode”
等字詞。 因此,要測試此功能,請保持Ultra Motivator
打開并通過Apple的桌面Messages
應(yīng)用程序自行發(fā)送文本。 給自己發(fā)一個代碼:“Your code is 1234.”
。然后,QuickType
欄會向你顯示在代碼字段中自動填充“1234”
的選項。
注意:iOS可以識別所有支持的iOS語言中與
“code” or “passcode”
等效的單詞。
點按Submit
以顯示Motivational view controller
。
Password Ninja Enlightenment Attained!
祝賀你! 你是一個真正的忍者密碼戰(zhàn)士。
花點時間深入了解隨機動機,然后在iOS設(shè)備上打開Safari
。 通過在以下網(wǎng)址中將“[your domain]”
替換為您的實際域,導(dǎo)航到您的登錄網(wǎng)頁:
https://[domain name]/login
點擊Username field
后,您的網(wǎng)頁應(yīng)顯示您在iOS應(yīng)用中注冊時保存的相同憑據(jù)。
同樣,如果您通過Safari
在https://[domain name]/register
注冊創(chuàng)建一個新帳戶并返回iOS應(yīng)用程序進行登錄,則這些憑據(jù)應(yīng)自動填充。
這是很多工作,但你已經(jīng)為你的努力取得了很多成就。 您現(xiàn)在已經(jīng)實現(xiàn)了iOS密碼自動填充,生成和同步。 您的應(yīng)用程序的登錄操作現(xiàn)在是安全的,易于使用并直接與您的網(wǎng)站集成關(guān)聯(lián)!
查看WWDC 2017’s Introducing Password AutoFill for Apps video和WWDC 2018’s Automatic Strong Passwords and Security Code AutoFill video,以更廣泛地了解您剛剛實現(xiàn)的功能。
后記
本篇講述了提高用戶安全性和體驗,感興趣的給個贊或者關(guān)注~~~