generate example java android cryptography keystore hmac

java - example - android keystore ionic



Almacenamiento de una clave hmac en Android keystore (1)

Estoy usando el código siguiente para crear una clave hmac y devolverla como una cadena.

KeyGenerator keyGen = null; try { keyGen = KeyGenerator.getInstance("HmacSHA256"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } SecretKey key = keyGen.generateKey(); byte[] encoded = key.getEncoded(); String s=Base64.encodeToString(encoded, Base64.DEFAULT); Log.i("Hmac key before encrypt",s); try { KeyStore keystore = KeyStore.getInstance("AndroidKeyStore"); keystore.load(null, null); KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keystore.getEntry("temp", null); RSAPublicKey publicKey = (RSAPublicKey) privateKeyEntry.getCertificate().getPublicKey(); Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] cipherBytes = cipher.doFinal(encoded); return Base64.encodeToString(cipherBytes,Base64.DEFAULT); } catch (UnrecoverableEntryException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (CertificateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }

¿Cómo puedo almacenar esto en el almacén de claves de Android ?. He intentado usar el siguiente código:

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); KeyStore.ProtectionParameter param = new KeyStore.PasswordProtection("test".toCharArray()); keyStore.setEntry("key1",hmacKey,param);

Obtengo un error sin importar en qué formato esté hmacKey: String / Bytes o javax.crypto.SecretKey . A continuación están los errores: En caso de pasar la clave hmacKey :

Wrong 2nd argument type. Found: ''java.security.Key'', required: ''java.security.KeyStore.Entry''

Lo mismo en los casos en que paso una cadena o matriz de bytes.

Si java.security.KeyStore.Entry el parámetro a java.security.KeyStore.Entry , aún no funciona.

¿Es esta la forma correcta de hacerlo? ¿Alguien puede dar consejos sobre cómo la clave HMAC se puede almacenar en el almacén de claves con un alias. ¿Cómo se puede convertir la clave java.security.KeyStore.Entry formato java.security.KeyStore.Entry ?


El almacén de claves de Android se creó para permitirle usar claves simétricas y claves simétricas fuera del código de su aplicación. Como se especifica en el material de capacitación :

El material clave nunca ingresa al proceso de solicitud. Cuando una aplicación realiza operaciones criptográficas usando una clave de Android Keystore, detrás de escena, texto sin formato, texto cifrado y mensajes para firmar o verificar se alimentan a un proceso del sistema que lleva a cabo las operaciones criptográficas. Si el proceso de la aplicación está comprometido, el atacante puede usar las teclas de la aplicación, pero no podrá extraer el material clave (por ejemplo, para usarlo fuera del dispositivo Android).

Por lo tanto, la idea de generar la clave dentro del código de la aplicación, y por lo tanto fuera de la tienda de claves, no es una buena idea. Cómo se genera una clave secreta dentro del almacén de claves se define para las claves HMAC en la API para la clase KeyGenParameterSpec :

KeyGenerator keyGenerator = KeyGenerator.getInstance( KeyProperties.KEY_ALGORITHM_HMAC_SHA256, "AndroidKeyStore"); keyGenerator.initialize( new KeyGenParameterSpec.Builder("key2", KeyProperties.PURPOSE_SIGN).build()); SecretKey key = keyGenerator.generateKey(); Mac mac = Mac.getInstance("HmacSHA256"); mac.init(key); ... // The key can also be obtained from the Android Keystore any time as follows: KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); key = (SecretKey) keyStore.getKey("key2", null);

Se pueden encontrar otros tipos de clave en la clase KeyProperties