Android: 检查密钥是否在安全硬件中
Android: Check if Key is in Secure Hardware
对于我的应用程序,我创建了一个 AES 密钥并想检查该密钥是否存储在安全硬件中。我用谷歌搜索并找到了 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();
但是,第一行 returns 出现 no such algorithm: AES for provider AndroidKeyStore
异常。但是难道不应该检查 AES 密钥是否也在 AES 的安全硬件中吗?
理论上我可以使用非对称加密,因为它只是我想要的一小段数据en/decrypt,但如果我可以使用对称加密我还是更喜欢。
你们有什么想法吗?
编辑:添加了进一步的实施细节。
为了获取对称密钥的 KeyInfo,需要以下代码:
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(secretKey.getAlgorithm(), "AndroidKeyStore");
KeyInfo keyInfo = (KeyInfo) secretKeyFactory.getKeySpec(secretKey, KeyInfo.class);
对于我的应用程序,我创建了一个 AES 密钥并想检查该密钥是否存储在安全硬件中。我用谷歌搜索并找到了 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();
但是,第一行 returns 出现 no such algorithm: AES for provider AndroidKeyStore
异常。但是难道不应该检查 AES 密钥是否也在 AES 的安全硬件中吗?
理论上我可以使用非对称加密,因为它只是我想要的一小段数据en/decrypt,但如果我可以使用对称加密我还是更喜欢。
你们有什么想法吗?
编辑:添加了进一步的实施细节。
为了获取对称密钥的 KeyInfo,需要以下代码:
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(secretKey.getAlgorithm(), "AndroidKeyStore");
KeyInfo keyInfo = (KeyInfo) secretKeyFactory.getKeySpec(secretKey, KeyInfo.class);