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,以更廣泛地了解您剛剛實現的功能。

后記

本篇講述了提高用戶安全性和體驗,感興趣的給個贊或者關注~~~

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容