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

时间:2017-11-14 22:13:53

标签: android encryption key android-keystore

我可以生成一个存储在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()或类似的东西。

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

2 个答案:

答案 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)

返回的Key对象有方法:

getAlgorithm()
getEncoded()
getFormat()

它们分别返回String,byte []和String。

点击here了解详情。