【发布时间】:2018-07-31 15:50:32
【问题描述】:
我对 android keystore 不是很熟悉。在我的项目中,我包含了以前创建的受密码保护的自定义密钥库,我需要从中提取具有已知别名的项目中的密钥。我不想修改密钥或不想创建任何密钥。是否可以?我需要对 android 密钥库进行一些说明。请帮助我解决这个问题。
【问题讨论】:
我对 android keystore 不是很熟悉。在我的项目中,我包含了以前创建的受密码保护的自定义密钥库,我需要从中提取具有已知别名的项目中的密钥。我不想修改密钥或不想创建任何密钥。是否可以?我需要对 android 密钥库进行一些说明。请帮助我解决这个问题。
【问题讨论】:
是的。您可以使用密钥别名获取密钥 看看这段代码 密钥库仅用于保存加密密钥,请勿将密码保存在那里!!!
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 级别
【讨论】: