studio programacion móviles introduzca desarrollo curso contraseña claves aplicaciones almacen java android security keystore android-keystore

java - programacion - No se puede generar la clave en el almacén de claves de Android



manual de programacion android pdf (1)

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 que el patrón de desbloqueo del teléfono no desbloquee el almacén de claves y / o un administrador del dispositivo bloquee el almacén de claves.

Así es como 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 dispositivo?
  • ¿Desbloquear el almacén de claves cuando ha sido bloqueado por un administrador del dispositivo?
  • ¿O reproducir este tema de otra manera?

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

Espero que la 1a 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 solo 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 KeyStore
  3. Vaya a Configuración> Seguridad y cambie el bloqueo de pantalla a algo "no seguro", por ejemplo, Diapositiva.
  4. Reinicie su dispositivo.

Después de que se inicie el dispositivo, se bloqueará KeyStore. com.android.credentials.UNLOCK intención de com.android.credentials.UNLOCK se iniciará en 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

Simplemente 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 rooteados. Este es el enfoque recomendado en el Blog de desarrolladores de Android :: http://android-developers.blogspot.jp/2013/02/using-cryptography-to-store-credentials.html