語境
我正在開發一個 iOS 應用程式,它應該受本地身份驗證的保護。用戶必須在打開應用程式后使用指紋/密碼/...解鎖應用程式。當應用程式在前臺運行時,應用程式應保持解鎖狀態。當應用程式解鎖時,應用程式必須訪問鑰匙串中的多個專案(某些專案在應用程式運行時可能會被多次訪問)。
使用 .userPresence 進行鑰匙串訪問控制
設定鑰匙串專案的訪問控制以在訪問專案.userPresence之前強制執行本地身份驗證。但是,這并不適合我的用例,因為每次訪問鑰匙串中的專案時,用戶都必須進行身份驗證。
// storing keychain items with .userPresence access control
guard let accessControl = SecAccessControlCreateWithFlags(
nil,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
.userPresence,
nil
) else {
throw CommonError("Unable to create access control flags")
}
let query = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: account,
kSecAttrAccessControl: accessControl,
kSecValueData: ...
] as [String: Any]
SecItemAdd(query as CFDictionary, nil)
為了適合我的用例,我可以自己實作本地身份驗證并使用kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly(而不是.userPresence)存盤鑰匙串專案。我擔心,不存盤鑰匙串專案.userPresence可能會導致安全風險。如果我自己實作本地身份驗證并使用kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly而不是使用訪問控制來訪問鑰匙串專案,這有.userPresence什么不同嗎?
// storing keychain items without access control
let query = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: account,
kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
kSecValueData: ...
] as [String: Any]
SecItemAdd(query as CFDictionary, nil)
我找不到任何文章或官方來源來解釋我的擔憂。如果可以鏈接任何官方檔案,或者甚至為我的用例提供更好的解決方案,我將不勝感激。
TL; 博士
設定鑰匙串專案的訪問控制是否.userPresence以任何方式提高安全性,或者如果我自己實作本地身份驗證并使用 存盤鑰匙串專案沒有任何區別kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly?
感謝您的幫助!
uj5u.com熱心網友回復:
在越獄設備上,或者至少在非越獄設備上具有足夠的權限提升,攻擊者可以偽裝成您的應用程式,以訪問您的鑰匙串專案。在.userPresence某種意義上提高了安全性,即使在攻擊者偽裝成您的應用程式的情況下,鑰匙串也會對您的鑰匙串專案的使用強制執行本地身份驗證,即,當攻擊者嘗試使用您的鑰匙串專案時,本地身份驗證將開始。有關此類攻擊如何可能的線索,可以在越獄分析中找到,例如本演講。
如果你自己實作了本地身份驗證,比如說,在你的應用程式中,那么攻擊者甚至不需要運行你的應用程式就可以完全繞過它(在剛剛描述的場景中)。就鑰匙串而言,當攻擊者請求訪問您的鑰匙串專案時,您的應用程式正在請求訪問您的鑰匙串專案。
除此之外,攻擊者可能還有其他方式試圖繞過您的本地身份驗證實作,例如,使用frida 之類的工具來篡改您已實作的邏輯。據我所知,當您使用 時.userPresence,很難篡改本地身份驗證邏輯,因為這將由 iOS 而不是您的應用程式邏輯控制。
現在,即使.userPresence強制執行本地身份驗證,攻擊者在嘗試訪問您的鑰匙串專案時仍可能會嘗試誘騙用戶進行本地身份驗證,但這是另一個討論。至少,使用.userPresence,應該比使用您自己的實作更難阻止本地身份驗證的發生。
好的,那么回到您可能考慮在您的用例中做的事情。可能有兩種可能:
- 您可以在 GitHub 等上找到各種移動應用程式保護技術,例如,檢測您的應用程式是否在越獄設備上運行,以及檢測對您的應用程式的其他型別篡改的可能性(還有商業產品)此類功能,甚至是安全存盤加密材料的替代方法)。因此,如果您進行風險評估并認為此類技術可以充分防止在越獄設備上運行,那么結合此類技術,您自己實施本地身份驗證的原始方法可能仍然被認為是一個很好的解決方案。
.userPresence出于安全原因,您可以改為考慮使用,并重新檢查您的應用程式流程和用戶體驗,例如,以減少需要執行這些加密/解密操作、批處理它們的頻率,甚至在您的用戶界面中顯示某些內容以解釋給用戶為什么每次都需要進行本地身份驗證。根據您的應用程式的功能以及您如何解釋它,如果您可以幫助用戶理解為什么他們需要進行本地身份驗證,也許用戶甚至可能對您的應用程式的安全性更有信心?
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/349842.html
標籤:ios 迅速 安全 钥匙链 苹果-cryptokit
上一篇:每個用戶“型別”的PHP子檔案夾
