如何正确使用SecRecord(KeyChain)?

How to correctly use SecRecord (KeyChain)?

所以我有一些我最初从 Xamarin.Auth 获取的代码,用于在设备上存储敏感数据,例如密码:

var record = new SecRecord(SecKind.GenericPassword);
record.Service =  "MyServiceId"
record.Generic = NSData.FromString(value, NSStringEncoding.UTF8); ;
record.Accessible = SecAccessible.WhenUnlocked;

statusCode = SecKeyChain.Add(record);

我猜存储的数据是用 SecKind.GenericPassword 加密的。但是这个密码是如何生成的,这个值又存储在哪里。 Xamarin documentation 非常稀疏,只是说:

The SecRecord stores a password.

谁可以访问我存储的 value,这是使用 KeyStore 的正确方法吗?

为了限制此记录的访问方式,您可以在创建记录时使用 AccessControl 属性 而不是 Accessible:

record.AccessControl = new SecAccessControl(
    SecAccessible.WhenUnlocked,
    SecAccessControlCreateFlags.UserPresence);

请参阅:https://developer.xamarin.com/api/type/Security.SecAccessControlCreateFlags/ 了解您可以申请的更多标志。

SecKind 只是您要存储的记录类型。谁创建密码并不重要,它可以是您的应用程序,也可以是您从 API 或其他任何地方获得的东西。

也可以参考苹果官方文档:https://developer.apple.com/documentation/security/keychain_services/keychain_items