2017-01-04 55 views
1

我正在Xamarin.iOS中创建一个应用程序,它使用来自安全的SecKeyChain。其中,我试图将用户的凭证保存为KeyChain的SecRecord,然后再访问它。当应用程序启动时,它会检查KeyChain中是否有任何已保存的凭据,并决定是否提示手动登录。SecKeyChain项目和SecRecord设备和模拟器之间的调试差异,Xamarin iOS

当SecKeyChain.Add被调用时,它返回成功。但是,应用程序SecKeyChain.QueryAsRecord的强制关闭失败并显示错误代码AuthFailed。这只发生在设备上,而模拟器成功。

的另一个问题是关系到创建SecRecord。调试Device时创建的对象与Simulator之间存在严重的差异。创建SecRecord的代码是:

var credentialsRecord = new SecRecord(SecKind.GenericPassword) 
     { 
      Generic = NSData.FromString("record"), 
      Label = credentials.Username, 
      Account = credentials.Username, 
      Service = CredentialsStorageServiceName, 
      ValueData = NSData.FromBytes(credentials.Password.ToIntPtr(), Convert.ToUInt32(credentials.Password.Length()) * 2), 
      AccessControl = new SecAccessControl(SecAccessible.WhenPasscodeSetThisDeviceOnly, SecAccessControlCreateFlags.TouchIDCurrentSet) 
     }; 
var statusCode = SecKeyChain.Add(credentialsRecord); 

在entitlements.plist,我已经启用了钥匙串访问组,并添加了一个名为同我虚拟的Xcode project's包标识符组。在项目选项 - > iOS软件包签名中,我有一个签名标识和一个设置配置文件,自定义权利字段为空。

我是否缺少某些东西来访问设备的钥匙串,或者是否与其他问题有关?

请让我知道,如果我失去了一些东西,并提前谢谢你。

回答

1

我不是很紧密地与Xamarin,但由于它包装在C#中的iOS原生API,苹果自己的例子可以帮助(因为它基本上涵盖了您所描述的相同的情况下):https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/iPhoneTasks/iPhoneTasks.html#//apple_ref/doc/uid/TP30000897-CH208-SW1

而且它也许是寻找到苹果文档的SecAccessControlCreateWithFlagshttps://developer.apple.com/reference/security/1394452-secaccesscontrolcreatewithflags)由于您使用自定义的保护&标志

这里有用的是你使用的组合摘录:

SecAccessible.WhenPasscodeSetThisDeviceOnly保护MEA ns:

钥匙串中的数据只能在设备解锁时才能访问。仅在设备上设置密码时才可用。

SecAccessControlCreateFlags.TouchIDCurrentSet标志表示:

约束到带触摸ID用于访问当前登记的手指。触摸ID必须可用,并至少注册一个手指。如果手指被添加或移除,则项目无效。

至于在仿真器中使用钥匙串,我不会依赖于那里的一致行为。也没有TouchID或密码,所以钥匙串项目属性&使用它们的访问控制标志(就像你的情况)将不起作用。

长话短说,在使用钥匙串开发安全性时,最安全的方法是在实际设备上执行安全措施,以确保应用程序在用户手中的行为如预期。但是,如果您想在模拟器上开发,请使用默认标志(或使用苹果示例作为灵感),并切换到生产时更安全的标志。

相关问题