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

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

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

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

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

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

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

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

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


person Harry    schedule 22.09.2014    source источник
comment
Привет. Я только что написал об этом сообщение systemdotrun.blogspot. co.uk/2015/02/   -  person Dori    schedule 27.02.2015
comment
Ссылка @Dori не работает, вот обновленный URL doridori .github.io/android-security-the-forgetful-keystore/   -  person Tom    schedule 18.05.2016
comment
Спасибо :) В настоящее время я пишу краткий обзор KeyStore также github.com/doridori/Android-Security-Reference/blob/master/api/   -  person Dori    schedule 19.05.2016


Ответы (1)


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

person Harry    schedule 18.03.2015