重置设备上的钥匙串

Posted

技术标签:

【中文标题】重置设备上的钥匙串【英文标题】:Reset keychain on the device 【发布时间】:2013-04-26 12:44:58 【问题描述】:

我正在设备上的应用内测试登录流程(使用KeychainItemWrapper)。如何重置/删除我的应用的钥匙串?

在模拟器上,我通过单击 ios 模拟器 -> 重置内容和设置... 来完成。

【问题讨论】:

***.com/questions/7142774/…的可能重复 @DanielMartín 您链接的问题是关于以编程方式重置钥匙串(我在我的应用程序中执行此操作)。我想知道如何手动进行测试。 我知道的唯一方法是通过设备设置、常规、重置、重置所有设置。它将重置设备上安装的每个应用程序的钥匙串。 我对此表示赞同,但意识到答案不正确。即使在卸载应用程序然后“重置所有设置”之后,它也没有删除我的应用程序的钥匙串。 @Jonny 也许是 iCloud 钥匙串之类的?不确定您如何将数据存储在钥匙串中。我会在我的应用程序中创建一个“注销”方法来手动删除所有数据。 【参考方案1】:

钥匙串项目位于 iOS 沙箱中,用户无权删除不需要的钥匙串项目。这些只能通过 API 访问。

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:[[NSBundle mainBundle] bundleIdentifier] accessGroup:nil]; 

//或者你如何访问你的钥匙串

[keychainItem resetKeychainItem];

或者您可以从设备设置、常规、重置、重置所有设置中重置您的设备>>。 但是,它会重置设备上安装的每个应用的钥匙串。

【讨论】:

重置所有设置不会重置钥匙串。 WiFi密码被删除,但我的***密码和存储在钥匙串中的应用密码仍然存在。 您应该执行“擦除所有内容和设置”以清除钥匙串。 @Fahri,我如何“删除所有内容和设置”而不是“重置内容和设置”? 警告:删除所有内容和设置将擦除设备,包括应用程序和媒体!【参考方案2】:

您可以使用钥匙串转储器转储钥匙串数据。 获取以下链接 https://github.com/ptoomey3/Keychain-Dumper

只需转到此网址并下载 zip 文件并解压缩即可。在这个文件夹中,我们唯一感兴趣的文件是 keychain_dumper 二进制文件。钥匙串中的应用程序允许访问的信息在其权利中指定。此二进制文件使用带有通配符权利的自签名证书进行签名,因此它能够访问所有钥匙串项目。还可能有其他方法来确保授予所有钥匙串信息,例如让权利文件包含所有钥匙串访问组或使用提供对所有钥匙串数据的访问的特定钥匙串访问组。例如,工具 Keychain-viewer 使用以下权利。

com.apple.keystore.access-keychain-keys

com.apple.keystore.device

1) 只需将此二进制文件上传到您设备的 /tmp 文件夹中并确保其可执行。

2) 现在确保存储在 /private/var/Keychains/keychain-2.db 位置的钥匙串数据库文件是全球可读的。

3) 现在转到终端,您可以通过命令转储数据

.keychain_dumper

4) 上面的命令会列出所有的用户名和密码。 但上面只会转储通用密码和互联网密码。使用“-h”命令可以查看使用信息。

5) 您可以使用“-a”命令转储所有信息。

您可以在此处阅读更多信息和示例dumping keychain data

【讨论】:

【参考方案3】: 从here 下载 keychainWrapper 并将其添加到您的项目中。 在你想要的viewController中写下如下代码 重置钥匙串。

代码:

#import "KeychainItemWrapper.h"

@interface YourViewController ()

    KeychainItemWrapper *keychainItemWrapper;


- (void)viewDidLoad 

    [super viewDidLoad];

    keychainItemWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"appname" accessGroup:nil];



- (IBAction)logoutButtonPressed:(id)sender 

    [keychainItemWrapper resetKeychainItem];


【讨论】:

因为钥匙串包装器的“此处”链接不再有效而被否决。【参考方案4】:

我需要为我的应用清除整个用户存储空间,所以使用了这个:

NSMutableDictionary *storage = [[NSMutableDictionary alloc] init];
[storage setObject:"myService" forKey:(__bridge id)kSecAttrService];
[storage setObject:["myAccount" dataUsingEncoding:NSUTF8StringEncoding] forKey:(__bridge id)kSecAttrAccount];
// Possibly other attributes e.g.
[storage setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];
[storage setObject:["somethingCustom" dataUsingEncoding:NSUTF8StringEncoding] forKey:(__bridge id)kSecAttrGeneric];
OSStatus status = SecItemDelete((CFDictionaryRef)storage);
// Handle status
// ...

【讨论】:

以上是关于重置设备上的钥匙串的主要内容,如果未能解决你的问题,请参考以下文章

如何在模拟器中重置钥匙串?

想使用登录钥匙串卡死

向当前捆绑包 ID 添加前缀会重置钥匙串吗?

如何查看 iPhone 模拟器的钥匙串

清除 UIAutomation 测试的钥匙串

iOS 中钥匙串服务的生命周期