【问题标题】:How to migrate KeyStore and Keychain key-value pairs generated by and old Cordova-based App to a new React Native based App?如何将旧的基于 Cordova 的 App 生成的 KeyStore 和 Keychain 键值对迁移到基于 React Native 的新 App?
【发布时间】:2020-02-10 13:54:58
【问题描述】:

场景非常简单:有一个使用 Cordova 编写的旧应用程序,必须使用一个使用 React Native 从头开始​​编写的新应用程序进行更新。

我不是使用 Cordova 编写的应用程序的开发人员和维护人员,但我可以接触到它的源代码。我必须重写应用程序并进行“静默”更新,即新应用程序不得“重置”存储在 KeyStore (Android) 和 Keychain (iOS) 上的数据,并且必须重用这些数据。

当我在测试设备上“更新”应用程序时,我尝试使用以下方法访问旧应用程序生成的数据:

并尝试获取数据,但没有成功。问题在 iOS 和 Android 上是一样的。

目前专注于 iOS,我使用 Xcode 来构建这两个应用程序。首先,我构建了旧版本的应用程序,生成数据并将它们存储在钥匙串上。然后,我构建了新的 App 版本,取代了之前的版本。我已确保在 Xcode 上,Bundle IdentifierSigning Certificate 对于两个版本都是相同的。但是从新版本的应用程序我仍然无法访问钥匙串。进行试金石测试:我降级应用程序再次重新构建旧版本,因此旧应用程序替换新应用程序,在这种情况下,我可以从旧应用程序访问钥匙串数据.

我怀疑,即使 Bundle Identifier,这两个应用程序正在使用两个不同的 Keychain zones。那么,我必须做些什么才能从新应用访问旧应用存储的数据?

我的想法是用户不应该受到应用程序更新的影响,所以旧应用程序的钥匙串(和KeyStore)必须被新应用程序重新使用。

注意:我看到在旧App上,Keychain/KeyStore中用来存储数据的函数是:

var ss = new cordova.plugins.SecureStorage(callback)

注意:我已经阅读了this from Apple Developer website,但我想这可能不是我的情况,因为我无法在旧应用程序上设置钥匙串共享,因为我们不允许发布 Cordova 的更新-基础应用程序。但是,我们在内部尝试使用共享访问但没有成功。

【问题讨论】:

    标签: react-native cordova migration keystore keychain


    【解决方案1】:

    尤其是在 iOS 中,钥匙串访问不仅与应用程序的 Bundle ID 和签名证书相关联。还有第三个元素称为“组授权”,旨在允许来自同一供应商的多个应用程序共享对相同数据的钥匙串访问(想象单独的电子邮件和日历应用程序共享用户的登录数据)。此机制的文档从这里开始:

    https://developer.apple.com/documentation/security/keychain_services/keychain_items/sharing_access_to_keychain_items_among_a_collection_of_apps

    文档相当密集,但尽管它旨在让多个应用程序共享数据,但它也控制着一个应用程序读取其 OWN 数据。您必须确保您的参数与旧应用程序精确匹配,否则您将无法读取旧值。您没有提供旧应用程序或新应用程序的代码,但作为示例,如果旧应用程序在 iOS 上的 Keychain 中存储了值,您可以使用react-native-keychain 和以下代码来读取它:

    // The "access group" is the Team ID of the OLD APP followed by its full Bundle ID
    const accessGroup = 'A12BC3D45.com.company.BundleId';
    
    const accessOptions = {
        accessGroup,
        accessible: Keychain.ACCESSIBLE.AFTER_FIRST_UNLOCK,
    };
    
    const oldCreds = await Keychain.getGenericPassword();
    console.debug('Found old credentials', oldCreds); // REMOVE AFTER DEBUGGING
    

    react-native-keychain 有多个加载函数,如果您的旧应用以不同方式存储内容,您可能需要尝试其他函数(例如 getInternetCredentials)。

    【讨论】:

      猜你喜欢
      • 2015-08-02
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多