android - 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
}
}
}
什么地方出了错 ?
解决方案
推荐阅读
- arrays - 将多行制表符分隔的文本转换为数组 Swift 4
- python - 如何从多个 csv 文件中读取仅存在于第一个文件中的 user_ids 的数据并创建一个数据透视表
- python - Flask-SQLAlchemy 在创建表之前创建模式
- algorithm - 如何为最大子序列积编写适当的算法
- javascript - 从对象数组创建单个对象 - JS/ES6
- javascript - 如何找到一组唯一的数组对?
- android - 尝试访问 firebase 数据库时不断出错
- assembly - 在 MIPS 中查找数组中的最小和最大?
- windows - 我对matlab中的一个函数有疑问
- typescript - null 不能分配给类型