AndroidKeyStore уничтожен после смены пароля устройства

В настоящее время я работаю над Android-приложением, которое основано на архитектуре клиент-сервер. Для безопасности данных я использую пару Public-Private key для шифрования и подписи данных. Я использую AndroidKeyStore для хранения пары ключей. Ниже приведен код для генерации пары ключей:

KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(
        mContext)
        .setAlias(mPrivateKeyAlias) 
        .setSubject(new X500Principal("CN=" + mPrivateKeyAlias))
        .setSerialNumber(
                BigInteger.valueOf(System.currentTimeMillis()))
        .setStartDate(start.getTime())
        .setEndDate(end.getTime()).setKeySize(2048).build();

KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance(
        "RSA",
        "AndroidKeyStore");

kpGenerator.initialize(spec);
// Key Pair will be saved in AndroidKeyStore
KeyPair pair = kpGenerator.generateKeyPair();

После выполнения этого кода файлы, выпущенные Keystore (файлы CERT и PKEY) будут сгенерированы в каталоге /data/misc/keystore/user_0/. Я шифрую конфиденциальные данные приложений, такие как токен авторизации, и сохраняю их в Shared Pref по соображениям безопасности.

Но теперь, когда пользователь меняет пароль или пин-код устройства, файлы хранилища ключей удаляются, поскольку Masterkey, используемый для шифрования хранилища ключей, генерируется с использованием учетных данных устройства.

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

KeyStore keyStore = KeyStore
        .getInstance("AndroidKeyStore");
keyStore.load(null);
keyStore.setKeyEntry(mPrivateKeyAlias, mPrivateKey.getPrivateKey(),
        null, new Certificate[] { mPrivateKey.getCertificate() });

Но после этого кода создается только файл CERT в '/data/misc/keystore/user_0/' каталог и во время расшифровки с использованием закрытого ключа, давая некоторые недопустимые ошибки подписи.

Кроме того, я поделился своим открытым ключом с сервером, зашифровал данные с закрытым ключом, поэтому создание новой пары ключей не будет лучшим решением.

Итак, как я могу сохранить свою пару открытого личного ключа после смены пароля устройства? Если нет никакого обходного пути, каково точное использование AndroidKeyStore? Где я могу использовать это?

1 ответ

Решение

Эта проблема была исправлена ​​Google в версии Android 5.0 (Lollipop). Но для предыдущих версий Android вам придется смириться с этой проблемой.:(

Другие вопросы по тегам