2014-09-22 2 views
6

В настоящее время я работаю над андроидным приложением, основанным на архитектуре клиент-сервер. Для обеспечения безопасности данных я использую пару ключей Public-Private для шифрования и подписи данных. Я использую AndroidKeyStore для хранения пары ключей. Ниже приведен код для генерации пары ключей: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 файлов) будет генерироваться на «/ user_0/данные/разное//» хранилища ключей директории. Я шифрую конфиденциальные данные приложения, такие как auth-token, и сохраняю их в Shared Pref по соображениям безопасности.

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

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

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? Где я могу его использовать?

+0

Эй, я только что написал сообщение об этом материале http://systemdotrun.blogspot.co.uk/2015/02/android-security-forgetful-keystore.html – Dori

+1

@ Ссылка Дори мертва, вот обновленная url http://doridori.github.io/android-security-the-forgetful-keystore/#sthash.dBNZUIC0.dpbs – Tom

+0

Thx :) Я пишу краткий обзор к «KeyStore» в настоящее время также https: // github .com/doridori/Android-Security-Reference/BLOB/Master/API/keystore.md – Dori

ответ

4

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

Смежные вопросы