Как перенести пары ключ-значение KeyStore и Keychain, сгенерированные старым и основанным на Cordova приложением, в новое приложение на основе React Native? - PullRequest
0 голосов
/ 07 февраля 2020

Сценарий довольно прост: есть старое приложение, написанное с использованием Cordova, которое должно быть обновлено новым приложением, написанным с нуля с использованием React Native.

Я не являюсь разработчиком и сопровождающим приложения написано с использованием Cordova, но я мог бы положить руки на его исходный код. Мне нужно переписать приложение и выполнить «тихое» обновление, т. Е. Новое приложение не должно «сбрасывать» данные, хранящиеся в KeyStore (Android) и Keychain (iOS), и оно должно повторно использовать эти данные.

Когда я «обновляю» приложение на моих тестовых устройствах, я пытаюсь получить доступ к данным, сгенерированным старым приложением, используя:

и попытаться получить данные, но безуспешно. Проблема одинакова на iOS и на Android.

Сосредоточившись на данный момент на iOS, я использую Xcode для создания обоих приложений. Сначала я создаю старую версию приложения, генерирую данные и сохраняю их в связке ключей. Затем я создаю новую версию приложения, заменяя предыдущую. Я убедился, что в Xcode Идентификатор пакета и Сертификат подписи одинаковы для обеих версий. Но из новой версии приложения я все еще не могу получить доступ к связке ключей. Чтобы сделать лакмусовый тест: I downgrade приложение перекомпилирует старую версию в другой раз, поэтому старое приложение заменяет новую, и в этом случае из старого приложения я могу получить доступ к данным цепочки для ключей.

Я подозреваю, что даже если Идентификатор пакета , два приложения используют две разные цепочки для ключей зоны . Итак, что мне нужно сделать, чтобы получить доступ к данным, сохраненным старым приложением, из нового?

Идея, что обновление приложения не должно влиять на пользователя, поэтому связка ключей (и хранилище ключей) старого приложения должна быть повторно использована новым приложением.

Примечание: я вижу, что в старом приложении функция, используемая для хранения данных в связке ключей / хранилище ключей:

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

Примечание: я уже прочитал это с веб-сайта Apple Developer , но я полагаю, что это может быть не в моем случае, потому что я не могу настроить общий доступ к связке ключей в старом приложении , поскольку нам не разрешено выпускать обновление приложения Cordova-base. Но, тем не менее, мы попытались внутренне использовать общий доступ без успеха.

1 Ответ

1 голос
/ 10 февраля 2020

В частности, iOS, доступ к цепочке для ключей не просто привязан к идентификатору пакета и сертификату подписи для приложения. Существует третий элемент, называемый «Права группы», который позволяет нескольким приложениям от одного поставщика совместно использовать доступ к цепочке для ключей к одним и тем же данным (представьте, что отдельные приложения электронной почты и календаря совместно используют данные для входа пользователя). Документация для этого механизма начинается здесь:

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

Документация довольно плотная, но, несмотря на то, что она предназначена для нескольких приложений для обмена данными, она также контролирует чтение приложения свои собственные данные. Вы должны убедиться, что ваши параметры точно соответствуют старому приложению, иначе вы не сможете прочитать старые значения. Вы не предоставили код для старых или новых приложений, но, например, если старое приложение сохраняло значения в связке ключей в iOS, вы можете использовать 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), если ваше старое приложение хранило вещи по-другому.

...