首页 > 解决方案 > Android:如何修复“javax.crypto.AEADBadTagException”?

问题描述

我正在尝试在 Keystore 中保存一个简单的字符串,为此我正在使用下面的类KeystoreManager

一切正常,除了解密函数进入“A”行,下面返回javax.crypto.aeadbadtagexception

“一个”->"String(cipher.doFinal(encryptedData), charset("UTF-8"))"

class KeystoreManager() {

    companion object {
        private const val ANDROID_KEY_STORE = "AndroidKeyStore"
        private const val TRANSFORMATION = "AES/GCM/NoPadding"
    }

    private var keyStore: KeyStore? = null

    private var encryptedData: ByteArray? = null
    private var encryptedIv: ByteArray? = null

    // --

    init {
        initKeyStore()
    }

    // --

    private fun initKeyStore() {
        keyStore = KeyStore.getInstance(ANDROID_KEY_STORE)
        keyStore?.load(null)
    }

    fun encryptText(alias: String, textToEncrypt: String) {

        try {

            val cipher = Cipher.getInstance(TRANSFORMATION)
            cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(alias))

            encryptedIv = cipher.iv

            cipher.doFinal(textToEncrypt.toByteArray(charset("UTF-8")))
                .also { encryptedData = it }

        } catch (e: java.lang.Exception) {
            Timber.e("Could not encrypt text !")
        }
    }

    fun decryptText(alias: String): String {

        return try {

            val cipher = Cipher.getInstance(TRANSFORMATION)
            val spec = GCMParameterSpec(128, encryptedIv)

            cipher.init(Cipher.DECRYPT_MODE, getSecretKey(alias), spec)

            String(cipher.doFinal(encryptedData), charset("UTF-8"))

        } catch (e: java.lang.Exception) {
            Timber.e("Could not decrypt text !")
            ""
        }
    }

    private fun getSecretKey(alias: String): SecretKey? {

        try {

            val keyGenerator =
                KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEY_STORE)

            val keyGenParameterSpec = KeyGenParameterSpec.Builder(
                alias,
                KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
            )
                .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                .build()

            keyGenerator.init(keyGenParameterSpec)

            return keyGenerator.generateKey()

        } catch (e: Exception) {
            Timber.e("Failed to create secret key!")
            return null
        }
    }

}

什么地方出了错 ?

标签: androidandroid-fragmentsexceptionpassword-encryption

解决方案


推荐阅读