在Android密钥库中存储hmac密钥

我使用下面的代码来创建一个hmac键并将其作为字符串返回。

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(); } 

我怎样才能将它存储在android密钥库中? 我尝试使用以下代码:

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

无论hmacKey采用何种格式,我都会收到错误:String / Bytes或javax.crypto.SecretKey 。 以下是错误:如果传递Key hmacKey

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

在我传递字符串或字节数组的情况下也是如此。

如果我将参数类型化为java.security.KeyStore.Entry ,它仍然无效。

这是正确的方法吗? 任何人都可以指出如何使用别名将HMAC密钥存储在密钥库中。 如何将hmack密钥转换为java.security.KeyStore.Entry格式?

创建Android密钥库是为了允许您在应用程序代码之外使用非对称密钥和对称密钥。 如培训材料中所述 :

关键材料永远不会进入申请流程。 当应用程序使用Android密钥库密钥执行加密操作时,在幕后明文,密文和要签名或validation的消息被馈送到执行加密操作的系统进程。 如果应用程序的进程受到攻击,攻击者可能能够使用应用程序的密钥,但无法提取其密钥材料(例如,要在Android设备之外使用)。

因此,在应用程序代码中生成密钥的想法 – 因此在密钥库之外 – 并不是一个好主意。 如何在密钥库中生成密钥, 为KeyGenParameterSpec类的API中的 HMAC密钥定义:

 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); 

其他键类型可以在KeyProperties类中找到