我正在使用以下代码创建HMAC密钥并将其返回为字符串。
我该如何将此存储在Android密钥库中?我尝试使用以下代码:
无论以何种格式(hmacKey是字符串/字节还是javax.crypto.SecretKey),我都会得到错误。下面是错误提示: 如果传递的密钥为
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是字符串/字节还是javax.crypto.SecretKey),我都会得到错误。下面是错误提示: 如果传递的密钥为
hmacKey
:Wrong 2nd argument type. Found: 'java.security.Key', required: 'java.security.KeyStore.Entry'
同样适用于当我传递字符串或字节数组的情况。
如果我将参数强制转换为java.security.KeyStore.Entry
,它仍然无法正常工作。
这是正确的方法吗?有人可以指点如何使用别名将HMAC密钥存储在密钥库中。如何将hmack密钥转换为java.security.KeyStore.Entry
格式?