我有加密/解密数据的 Android 代码。它是一年多前由另一位开发人员(后来他离开了)编写的,直到最近它才开始崩溃,并出现以下异常:
android.security.keystore.AndroidKeyStoreRSAPrivateKey cannot be cast to javax.crypto.SecretKey
这似乎仅在升级应用程序并且现有密钥已经存在时才会发生。我针对之前的版本(有效)运行了 gradle 文件的差异,并且没有更新任何框架/sdk。
异常发生在 .build() 中:
private fun getOrGenerateNewKeysetHandle(alias: String): KeysetHandle {
val keysetName = "${TINK_KEYSET_NAME}_$alias"
return AndroidKeysetManager.Builder()
.withSharedPref(reactApplicationContext, keysetName, PREF_FILE_NAME)
.withKeyTemplate(HybridKeyTemplates.ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM)
.withMasterKeyUri(MASTER_KEY_URI)
.build()
.keysetHandle
}
我将代码跟踪到AndroidKeystoreAesGcm
并且从 getKey 返回的分配发生异常(成功):
public AndroidKeystoreAesGcm(String keyId) throws GeneralSecurityException, IOException {
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null /* param */);
key = (SecretKey) keyStore.getKey(keyId, null /* password */);
}
这让我不确定如何进行。KeyStore 有一个密钥,我需要它来访问应用程序数据。我怀疑我的老宿敌 gradle 是罪魁祸首,但是......好吧,任何帮助或洞察力将不胜感激。