No se puede generar clave en el almacén de claves de Android

Actualmente estamos experimentando un problema en el que a veces cuando un usuario instala nuestra aplicación, la aplicación intenta acceder y generar una clave en el almacén de claves, pero el almacén de claves lanza esta excepción:

Caused by: java.lang.IllegalStateException: could not generate key in keystore at android.security.AndroidKeyPairGenerator.generateKeyPair(AndroidKeyPairGenerator.java:100) at java.security.KeyPairGenerator$KeyPairGeneratorImpl.generateKeyPair(KeyPairGenerator.java:275) 

Creemos que tiene que ver con el patrón de desbloqueo del teléfono no desbloquear el almacén de claves, y / o un administrador de dispositivos bloquea el almacén de claves.

Así se crea el almacén de claves y cómo se generan las claves:

 public SecretKeyWrapper(Context context, String alias) throws GeneralSecurityException, IOException { mCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); final KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); if (!keyStore.containsAlias(alias)) { generateKeyPair(context, alias); } final KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias, null); mPair = new KeyPair(entry.getCertificate().getPublicKey(), entry.getPrivateKey()); } private static void generateKeyPair(Context context, String alias) throws GeneralSecurityException { final Calendar start = new GregorianCalendar(); final Calendar end = new GregorianCalendar(); end.add(Calendar.YEAR, 100); final KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context) .setAlias(alias) .setSubject(new X500Principal("CN=" + alias)) .setSerialNumber(BigInteger.ONE) .setStartDate(start.getTime()) .setEndDate(end.getTime()) .build(); final KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); gen.initialize(spec); gen.generateKeyPair(); } 

¿Alguien sabe cómo:

  • ¿Bloquear el almacén de claves como administrador de dispositivos?
  • ¿Desbloquear el almacén de claves cuando ha sido bloqueado por un administrador de dispositivos?
  • O reproducir este problema de otra manera?

    Caused by: java.lang.IllegalStateException: could not generate key in keystore

    Esperamos que la primera excepción se resuelva siguiendo el siguiente código:

     KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); ks.load(null); KeyStore.Entry entry = ks.getEntry(alias, null); ks.getEntry(alias, new KeyStore.PasswordProtection(password)) 

    Desbloquee el almacén de claves cuando haya sido bloqueado por un administrador de dispositivo:

    KeyStore puede aparecer bloqueado no sólo en dispositivos pre-ICS. La forma más sencilla de bloquear KeyStore es:

    1. Inicialice KeyStore configurando KeyGuard (patrón, pin o contraseña en el bloqueo de pantalla)
    2. Agregue claves o lo que almacene en el KeyStore
    3. Vaya a Configuración> Seguridad y cambie Bloqueo de pantalla a algo "no seguro", por ejemplo, Diapositiva.
    4. Reinicie el dispositivo.

    Después de arrancar el dispositivo, KeyStore será LOCKED. com.android.credentials.UNLOCK inicia la actividad com.android.settings.CredentialStorage , que, a su vez, mostrará UnlockDialog, solicitando una contraseña.

      * KeyStore: LOCKED * KeyGuard: OFF/ON * Action: old unlock dialog * Notes: assume old password, need to use it to unlock. * if unlock, ensure key guard before install. * if reset, treat as UNINITALIZED/OFF 

    Sólo puede generar una clave maestra y almacenarla como un archivo privado, otras aplicaciones no podrán leerla, por lo que estará bien en dispositivos no enraizados. Este es el enfoque recomendado en el Android Developers Blog :: http://android-developers.blogspot.jp/2013/02/using-cryptography-to-store-credentials.html

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.