Android KeyStore 获取存储密钥的原始字节/字符串

ari*_*ius 2 encryption android key android-keystore

我可以生成一个密钥并存储在 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();
}
Run Code Online (Sandbox Code Playgroud)

同样,我可以像这样检索它:

keyStore.getKey(KEY_ALIAS, null);
Run Code Online (Sandbox Code Playgroud)

我知道 getKey() 函数返回一个 Key 对象,但我还没有找到一种方法来显示密钥本身。它似乎没有 toString() 或 getBytes() 或类似的东西。

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

Jam*_*olk 5

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

Android 密钥库系统可保护密钥材料免遭未经授权的使用。首先,Android 密钥库通过防止从应用程序进程和整个 Android 设备中提取密钥材料,减少了在 Android 设备外部未经授权使用密钥材料的情况。

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

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

应该使 key 成为对 Key 对象的有效非空引用,algorithm应该返回“AES”,但format应该是nullshould encoded