在iOS8中,只能通过指纹认证来限制对钥匙链的访问



我需要安全地存储/检索iOS密钥链上的项目。

从苹果KeyChainServicesReference文档(https://developer.apple.com/library/ios/documentation/security/Reference/keychainservices/Reference/reference.html)我检索钥匙链项目使用SecItemCopyMatching调用。后者会弹出一个系统提示,用于根据本地密钥链进行身份验证,该密钥链允许使用指纹或4位电话密码。

虽然我认为身份验证与指纹安全,这是4位数的PIN选项,降低了我目前的安全性。所以,我的问题是:是否有一种方法来查询钥匙链只有指纹选项(没有密码选项,如果指纹认证失败,它只是失败,没有回退到4位密码)

我已经研究了LocalAuthentication,尽管后者提供了我需要的确切流程,但LA没有给我访问钥匙链的权限,因此LA对我没有用处

Thanks lot in advance

In LAContext.h:

/// Fallback button title.
/// @discussion Allows fallback button title customization. A default title "Enter      Password" is used when
///             this property is left nil. If set to empty string, the button will be hidden.
@property (nonatomic, copy) NSString *localizedFallbackTitle;

这段代码删除了按钮,用户可以使用他们的手指或取消:

LAContext *context = [[LAContext alloc] init];
context.localizedFallbackTitle = @"";
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics ...

你是对的,在iOS 8中,你没有选择将一个项目存储在Keychain中,并且只有在成功的Touch ID认证后才能访问它。iOS 8中添加的kSecAccessControlUserPresence访问控制标志使项目在Touch ID或Passcode认证后都可以访问。

但这现在可以在iOS 9中完成。新增"kSecAccessControlTouchIDAny"、"kSecAccessControlTouchIDCurrentSet"两个Touch id相关标志

因此,您所需要做的就是在为Keychain项目(具有SecAccessControlCreateWithFlags功能)创建访问控制对象时使用这两个标志中的任何一个,并在添加具有SecItemAdd功能的项目时将该对象分配给kSecAttrAccessControl属性。

有一个来自苹果的例子说明了这一点;参考addTouchIDItemAsync方法

我还没有深入研究iOS 8的钥匙链,但请记住,4位密码是由用户设置的。苹果公司建议用户在开启TouchID时,同时开启一个更复杂的密码,并表示:"由于安全性取决于其最薄弱的地方,因此您可以选择使用复杂的字母数字密码来增加4位数密码的安全性。"http://support.apple.com/kb/HT5949

因此,用户仍然可以选择使用比4位密码更复杂的密码。你不能强迫他们这么做。如果你真的想强迫他们,听起来你必须放弃Touch ID的便利性。

最新更新