我可以从具有已知别名的受密码保护的密钥库中获取密钥吗?

时间:2018-07-31 15:50:32

标签: android android-keystore

我对android keystore不太熟悉。在我的项目中,我包括以前创建的受密码保护的自定义密钥库,我需要从中提取具有已知别名的项目中的秘密密钥。我不想修改秘密密钥或不想创建任何秘密密钥。可能吗?我需要对android keystore进行一些说明。请在这种情况下帮助我。

1 个答案:

答案 0 :(得分:0)

是的。您可以使用密钥别名获取密钥  看这段代码 密钥库仅用于保存加密密钥,请勿在此处保存密码!!!

 private fun init() {
    keyStore = KeyStore.getInstance(AndroidKeyStore)
    keyStore.load(null)

    if (!keyStore.containsAlias(KEY_ALIAS)) {

        val keyGenerator: KeyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, AndroidKeyStore)
        keyGenerator.init(
                KeyGenParameterSpec.Builder(KEY_ALIAS, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
                        .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                        .build())

        keyGenerator.generateKey()
    }
}


override fun encrypt(byteArray: ByteArray): ByteArray {
    val keyStoreKey = keyStore.getKey(KEY_ALIAS, null)
    val cipher = Cipher.getInstance(AES_MODE)
    cipher.init(Cipher.ENCRYPT_MODE, keyStoreKey)
    val encodedBytes = cipher.doFinal(byteArray)
    val params = cipher.parameters
    val iv = params.getParameterSpec(GCMParameterSpec::class.java).iv
    saveIv(iv)

    return encodedBytes
}

override fun decrypt(byteArray: ByteArray): ByteArray {
    val iv = getIv()
    val ivSpec = GCMParameterSpec(128, iv)
    val keyStoreKey = keyStore.getKey(KEY_ALIAS, null) as SecretKey
    val cipher = Cipher.getInstance(AES_MODE)
    cipher.init(Cipher.DECRYPT_MODE, keyStoreKey, ivSpec)

    return cipher.doFinal(byteArray)
}

这是我对android API级别的加密和解密> = 23 对于18> = API级别<23,您需要AES加密