Android:检查金钥是否在安全硬体中

问题描述

对于我的应用程序,我创建了一个AES密钥,并希望检查该密钥是否存储在安全硬件中。我在Google上搜索并找到了RSA的示例,但认为这没有关系。下面是我发现的RSA示例:

final KeyGenerator keyGenerator = KeyGenerator
        .getInstance(KeyProperties.KEY_ALGORITHM_AES,"AndroidKeyStore");

final KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder("key_alias",KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
        .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
        .build();

keyGenerator.init(keyGenParameterSpec);
final SecretKey secretKey = keyGenerator.generateKey();

final Cipher cipher = Cipher.getInstance("AES/GCM/nopadding");
cipher.init(Cipher.ENCRYPT_MODE,secretKey);

KeyFactory keyFactory = KeyFactory.getInstance(secretKey.getAlgorithm(),"AndroidKeyStore");
KeyInfo keyInfo = keyFactory.getKeySpec(secretKey,KeyInfo.class);
keyInfo.isInsideSecureHardware();

但是,第一行返回一个no such algorithm: AES for provider AndroidKeyStore异常。但是难道不应该检查AES密钥是否也在AES的安全硬件中吗?

从理论上讲,我可以使用非对称加密,因为这只是我要加密/解密的一小段数据,但是如果我可以使用对称加密,我还是会更喜欢。

你们有个主意吗?

编辑:添加了更多实施细节。

解决方法

为了获取对称密钥的KeyInfo,需要以下代码:

SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(secretKey.getAlgorithm(),"AndroidKeyStore");
KeyInfo keyInfo = (KeyInfo) secretKeyFactory.getKeySpec(secretKey,KeyInfo.class);