重新安装应用程序后,钥匙串存储的密码仍然可用

Posted

技术标签:

【中文标题】重新安装应用程序后,钥匙串存储的密码仍然可用【英文标题】:keychain stored password is still available after app re-installed 【发布时间】:2017-08-11 13:09:06 【问题描述】:

我正在使用 xcode8+swift3 开发 ios 应用。

我创建了将用户密码存储到钥匙串并从钥匙串中读取密码的功能。我创建的函数可以参考here。

我注意到的一般问题是,即使我卸载了该应用程序,当我重新安装该应用程序时,我的应用程序从钥匙串中读取的密码是以前安装的应用程序的旧密码(已卸载)。

我的问题是,解决此问题的最佳做法是什么?

【问题讨论】:

即使您删除了应用程序,钥匙串中的项目仍然存在。如果您不想要旧的详细信息,您可以在安装应用后删除钥匙串项 是的,我也是这么想的,但是在实践中最好的地方在哪里呢? AppDelegate didFinishLaunchingWithOptions ? 你可以在 userdefaults 中存储一个 bool 标志,并检查 AppDelegate。当您删除应用程序时,USerdefualts 会被删除,所以这应该可以工作! 【参考方案1】:

在应用委托中你可以这样做:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions


   BOOL savedInKeychain = [[NSUserDefaults standardUserDefaults]boolForKey:@"savedInKeychain"];
   if(!savedInKeychain)
    //There is no keychian data saved in this app
    //check if data exisst in keychain
    if(kechainData)
        //Delete keychain data
    

   return YES;

稍后在钥匙串中保存数据后,在 userdefaults 中将 savedInKeychain 设置为 YES。

【讨论】:

【参考方案2】:

钥匙串在卸载后被加密并持久化。 NSUserdefaults 未加密(不建议存储密码),卸载后不会持久化。

要检查应用程序是否是第一次启动并重置钥匙串,您可以使用:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedOnce"])
    
        // reset keychain
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedOnce"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    
    return YES;

【讨论】:

以上是关于重新安装应用程序后,钥匙串存储的密码仍然可用的主要内容,如果未能解决你的问题,请参考以下文章

在钥匙串 Swift 中存储整数

iOS 钥匙串中的项目能否在应用程序卸载和重新安装后继续存在?

有啥方法可以保存数据,即使在没有钥匙串的情况下在 ios 上重新安装应用程序?

在钥匙串中存储凭据不仅加密密码

Iphone 将信用卡信息保存在钥匙串中或使用密码学? [关闭]

iOS数据存储-钥匙串存储