在设备上重置钥匙串

47

我正在设备上测试我的应用程序中的登录流程(使用KeychainItemWrapper)。我该如何重置/删除我的应用程序的密钥链?

在模拟器上,我可以通过点击iOS模拟器-> 重置内容和设置...来进行操作。


可能是 https://dev59.com/FGw05IYBdhLWcg3wmC-_ 的重复问题。 - Daniel Martín
2
@DanielMartín,您链接的问题是关于如何在应用程序中以编程方式重置钥匙串(我已经这样做了)。我想知道如何手动进行测试目的的重置。 - syntagma
1
我所知道的唯一方法是从设备设置中进行操作,通常在“常规”选项下,选择“重置”,然后选择“重置所有设置”。这将会重置设备上安装的每个应用程序的密钥链。 - Daniel Martín
6
我投了赞成票,但后来意识到答案是错误的。即使卸载应用程序并“重置所有设置”,它也没有删除我应用程序的钥匙串。请帮我翻译这句话。 - Jonny
1
@Jonny 也许可以使用iCloud钥匙串之类的东西?我不确定你是如何在钥匙串中存储数据的。我会在我的应用程序中创建一个“注销”方法来手动删除所有数据。 - Maciej Swic
4个回答

14

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

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

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

[keychainItem resetKeychainItem];

或者您可以从设备设置中重置设备>>常规、重置、重置所有设置。 但是,它将重置设备上安装的每个应用程序的密钥链。


重置所有设置不会重置钥匙串。WiFi密码将被删除,但我保存在钥匙串中的VPN密码和应用程序密码仍将保留。 - Zia
3
清除钥匙串应该选择“抹掉所有内容和设置”。 - Fahri Azimov
@Fahri,我该如何选择“抹掉所有内容和设置”而不是“重置内容和设置”? - Adil Hussain
2
警告:擦除所有内容和设置将清除设备,包括应用程序和媒体! - Rafael Nobre

1
你可以使用Keychain dumper来转储钥匙串数据。 获取以下链接 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”命令转储所有信息。

您可以在转储钥匙串数据中阅读更多信息和示例。


0
  • 这里下载并添加keychainWrapper到您的项目中。
  • 在您想要重置钥匙串的视图控制器中编写以下代码。

代码:

#import "KeychainItemWrapper.h"

@interface YourViewController ()
{
    KeychainItemWrapper *keychainItemWrapper;
}

- (void)viewDidLoad {

    [super viewDidLoad];

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

}

- (IBAction)logoutButtonPressed:(id)sender {

    [keychainItemWrapper resetKeychainItem];

}

由于密钥链包装器的“here”链接不再有效,因此被投下了反对票。 - Tejas

0

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

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
// ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接