我可以生成一个存储在Android Keystore中的密钥,如下所示:
private static final String AndroidKeyStore = "AndroidKeyStore";
private static final String AES_MODE = "AES/GCM/NoPadding";
keyStore = KeyStore.getInstance(AndroidKeyStore);
keyStore.load(null);
if (!keyStore.containsAlias(KEY_ALIAS)) {
KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, AndroidKeyStore);
keyGenerator.init(
new KeyGenParameterSpec.Builder(KEY_ALIAS,
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setRandomizedEncryptionRequired(false)
.build());
keyGenerator.generateKey();
}
同样,我可以像这样检索它:
keyStore.getKey(KEY_ALIAS, null);
我知道getKey()函数返回一个Key对象,但我还没有找到一种方法来揭示密钥本身。它似乎没有toString()或getBytes()或类似的东西。
如何获取密钥的字节,或至少打印出字符串版本?它甚至可能吗?
答案 0 :(得分:1)
" AndroidKeyStore"是专门设计的,使这不可能或至少非常困难。有一个更完整的讨论here,但总结如下:
Android Keystore系统可保护密钥材料免遭未经授权的使用。 首先,Android Keystore减少了对密钥材料的未授权使用 通过阻止提取密钥在Android设备之外 来自应用程序进程的材料以及来自Android设备的材料 整体。
继续您的示例,以下附加代码行:
"post_filter": {
"bool": {
"should": [{
"match_phrase": {
authorsString: author
}
}]
}
}
应该使key成为对Key对象的有效非空引用,Key key = keyStore.getKey(KEY_ALIAS, null);
String algorithm = key.getAlgorithm();
String format = key.getFormat();
byte[] encoded = key.getEncoded();
应该返回" AES",但algorithm
应该format
应该{ {1}}。
答案 1 :(得分:0)