UYL密码管理器 1.1.0

UYL密码管理器 1.1.0

测试已测试
Lang语言 Obj-CObjective C
许可证 BSD
发布最新版本2014年12月

Keith Harrison维护。



UYL密码管理器 - 简单访问iOS密钥链

UYLPasswordManager类为iOS设备上的Apple Keychain Services提供了一个简单的包装。这个类是为了快速方便地创建、读取、更新和删除密钥链项而设计的。也支持密钥链组,以及设置密钥链项的数据迁移和保护属性的能力。

UYLPasswordManager已测试与iOS 7.1及更高版本。这并不代表它不会在较早版本上工作,只是我不再对较早版本进行测试。密码管理器代码使用了ARC进行内存管理,并使用了现代Objective-C语言。

安装

要在iOS应用程序中使用UYLPasswordManager类,请将以下文件复制到现有的Xcode项目中

  • UYLPasswordManager.h
  • UYLPasswordManager.m

共享实例

UYLPasswordManager类提供了一个共享实例以供方便使用。

访问共享实例

要访问UYLPasswordManager的共享实例,请使用sharedInstance类方法

UYLPasswordManager *manager = [UYLPasswordManager sharedInstance];

删除缓存项

UYLPasswordManager类缓存了对密钥链的最后访问。当同一个项被一个应用多次访问时,这是有效的。当您不再需要它们时,应该清除这些缓存条目。在设备锁定或移动到后台时,缓存将自动清除。

[manager purge];

使用密钥链

向密钥链中添加项

您在密钥链中存储的任何密钥都与一个标识符相关联。标识符也用于您需要检索密钥时。密钥和标识符都是NSString类的实例。

例如,要存储密码,您可能使用用户名作为标识符。

[manager registerKey:password forIdentifier:username];

从密钥链中检索项

检索标识符的密钥

NSString *result = [manager keyForIdentifier:username];

如果没有在钥匙串中找到匹配的标识符,将返回nil。

查找项

确定现有密钥是否在钥匙串中

BOOL result = [manager validKey:password forIdentifier:username];

如果只需检查标识符在钥匙串中是否存在,则可以传递nil作为密钥

BOOL result = [manager validKey:nil for Identifier:username];

删除项

从钥匙串中删除项

[manager deleteKeyForIdentifier:username];

数据保护类别

当将项目存储在钥匙串中时,您可以设置数据的可访问性和是否应该允许迁移到新设备。您应在向钥匙串添加或更新项之前设置这些属性。

钥匙串迁移

如果用户将加密备份恢复到新设备,且已设置为可迁移的密钥串项将被恢复到该设备。这使用户可以在不手动输入密码数据的情况下迁移到新设备。

迁移属性是一个BOOL,用于控制添加或更新的项是否可迁移。默认情况下,迁移属性设置为NO. 如果要将项设置为不可迁移,请在添加或更新项之前将迁移属性设置为NO。

manager.migrate = NO;

数据可访问性

accessMode属性控制钥匙串项的可访问性。有三个可能的值如下

  • UYLPMAccessibleWhenUnlocked - 仅当设备解锁时才能访问数据。

  • UYLPMAccessibleAfterFirstUnlock - 如果设备自启动以来至少解锁过一次,则在设备锁定时也可以访问数据。

  • UYLPMAccessibleAlways - 数据始终可访问,即使设备锁定也是如此。

默认为UYLPMAccessibleWhenUnlocked,这将在设备锁定时阻止访问项目。注意,如果需要在后台运行时访问钥匙串,建议允许解锁后访问。

manager.accessMode = UYLPMAccessibleAfterFirstUnlock;

组访问

如果需要在不同应用程序之间共享钥匙串项,则需要使用访问组。共享钥匙串访问的主要前提是所有应用程序都有一个共同的捆绑种子ID。App ID由两个部分组成,如下所述

<Bundle Seed ID> . <Bundle Identifier>

捆绑种子ID是Apple在您首次创建App ID时生成的唯一(与App Store一起)十个字符的字符串。捆绑标识符通常设置为反向域名字符串,用于标识您的应用(例如,com.yourcompany.appName),并在Xcode的应用程序Info.plist文件中指定。

要创建可以与现有应用共享钥匙串访问的新应用,您需要确保使用现有应用的捆绑种子ID。您在创建iPhone配置文件门户中的新App ID时这样做。您不是生成一个新值,而是从所有以前的捆绑种子ID列表中选择一个现有值。

具有共同的捆绑种子ID后,您需要选择一个名称作为共同钥匙串访问组。组名称必须以捆绑种子ID开头。例如

<Bundle Seed ID>.yourcompany

然后您需要在Xcode项目中添加一个entitlements plist文件(使用Add -> New File并选择Entitlements模板)。添加一个名为keychain-access-groups的新数组项,并在数组中创建一个包含访问组名称的字符串项。

访问钥匙串组

UYLPasswordManager 添加、检索和搜索密钥链项的方法都提供了带额外分组参数的格式。

[manager registerKey:password forIdentifier:username inGroup:group];

BOOL result = [manager validKey:nil for Identifier:username inGroup:group];

类文档

共享实例类方法

sharedInstance

+ (UYLPasswordManager *)sharedInstance

返回 UYLPasswordManager 共享实例的引用。首次访问时将分配共享实例。所有后续对此方法的访问都返回现有实例的引用。

dropShared

+ (void)dropShared

强制释放共享实例。正常情况下不应这样做,因为共享实例只使用少量内存。

密钥链访问方法

registerKey:forIdentifier:inGroup

向密钥链添加项或更新现有项。

- (void)registerKey:(NSString *)key forIdentifier:(NSString *)identifier inGroup:(NSString *)group

参数

key 要存储在密钥链中的键值。通常这是密码,或者最好是您要存储的实际密码的散列。

identifier 要存储的密钥链项的标识符。

group 密钥链访问组。此参数是可选的,可以设置为 nil。

deleteKeyForIdentifier:inGroup

从密钥链中删除项。

- (void)deleteKeyForIdentifier:(NSString *)identifier inGroup:(NSString *)group

参数

identifier 要删除的密钥链项的标识符。

group 密钥链访问组。此参数是可选的,可以设置为 nil。

validKey:forIdentifier:inGroup

在密钥链中搜索标识符并比较键的值。如果您不关心键的值,可以将其传递为 nil。

- (BOOL)validKey:(NSString *)key forIdentifier:(NSString *)identifier inGroup:(NSString *)group

参数

key 要验证的键的值。此参数可以是 nil,在这种情况下,如果为标识符找到项,则方法返回 true。

identifier 要搜索的密钥链项的标识符。

group 密钥链访问组。此参数是可选的,可以设置为 nil。

keyForIdentifier:inGroup

在密钥链中搜索标识符,如果存在,则返回关联键的值。

- (NSString *)keyForIdentifier:(NSString *)identifier inGroup:(NSString *)group

参数

identifier 要搜索的密钥链项的标识符。

group 密钥链访问组。此参数是可选的,可以设置为 nil。

registerKey:forIdentifier

向密钥链添加项或更新现有项。相当于调用 registerKey:forIdentifier:inGroup: 并将 group 设置为 nil。

- (void)registerKey:(NSString *)key forIdentifier:(NSString *)identifier

参数

key 要存储在密钥链中的键值。通常这是密码,或者最好是您要存储的实际密码的散列。

identifier 要存储的密钥链项的标识符。

deleteKeyForIdentifier

从密钥链中删除项。相当于调用 deleteKeyForIdentifier:inGroup: 并将 group 设置为 nil。

- (void)deleteKeyForIdentifier:(NSString *)identifier

参数

identifier 要删除的密钥链项的标识符。

validKey:forIdentifier

在密钥链中搜索标识符并比较密钥的值。如果您不关心密钥的值,可以将它传递为nil。相当于调用validKey:forIdentifier:inGroup:方法并将group参数设置为nil。

- (BOOL)validKey:(NSString *)key forIdentifier:(NSString *)identifier

参数

key 要验证的键的值。此参数可以是 nil,在这种情况下,如果为标识符找到项,则方法返回 true。

identifier 要搜索的密钥链项的标识符。

keyForIdentifier

在密钥链中搜索标识符,如果存在返回关联密钥的值。相当于调用keyForIdentifier:InGroup:方法并将group参数设置为nil。

- (NSString *)keyForIdentifier:(NSString *)identifier

参数

identifier 要搜索的密钥链项的标识符。

其他方法

purge

- (void)purge

删除任何缓存的密钥链数据。使用此方法确保所有敏感的密钥链数据从内存中删除。当设备锁定或应用进入后台时,此方法将自动调用。

属性

migrate

@property (nonatomic, assign) BOOL migrate

accessMode

@property (nonatomic, assign) UYLPMAccessMode accessMode