Android KeyStore 获取存储密钥的原始 bytes/string

Android KeyStore get raw bytes/string of stored key

我可以像这样生成一个密钥存储在 Android 密钥库中:

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() 函数 returns 是一个密钥对象,但我还没有找到揭示密钥本身的方法。它似乎没有 toString() 或 getBytes() 或类似的东西。

如何获取密钥的字节,或者至少打印出它的字符串版本?有可能吗?

Key 对象 returned 有方法:

getAlgorithm()
getEncoded()
getFormat()

它们分别returnString、byte[]和String。

点击here了解更多信息。

"AndroidKeyStore" 是专门为使这不可能或至少非常困难而设计的。有更完整的讨论here,但总结一下:

Android Keystore system protects key material from unauthorized use. Firstly, Android Keystore mitigates unauthorized use of key material outside of the Android device by preventing extraction of the key material from application processes and from the Android device as a whole.

继续您的示例,添加以下附加代码行:

Key key = keyStore.getKey(KEY_ALIAS, null);
String algorithm = key.getAlgorithm();
String format = key.getFormat();
byte[] encoded = key.getEncoded();

应该使 key 成为对 Key 对象的有效非空引用,algorithm 应该 return "AES",但是 format 应该 null应该 encoded