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 вам придется смириться с этой проблемой.:(