У меня есть приложение, использующее хранилище ключей Android для конфиденциальных данных. Когда Application.onCreate () я генерирую ключ AES из хранилища ключей. А затем Application.onCreate, прежде всего, проверим существующее сгенерированное хранилище ключей. но 2% пользователей моего приложения потеряли ключ KeyStore. 98% пользователь в порядке.
private const val androidKeyStore = "AndroidKeyStore"
private const val mode_aes = "AES/GCM/NoPadding"
private val keystore by lazy { KeyStore.getInstance(androidKeyStore) }
fun checkTEE(){
val count = PreferenceManager.increase(COUNT)
val startTime = System.currentTimeMillis()
val keyAlias = "techfin.key.test.id"
val info = TeeCheckInfo(count)
if(containsAlias(keyAlias).not()){
msg += " NOT_EXIST $info"
Logging.d(TAG,msg)
LogManager.sendWarnLog(msg)
}
generateAESKey(keyAlias)
}
fun generateAESKey(keyAlias:String){
keystore.load(null)
if (keystore.containsAlias(keyAlias)) {
return
}
KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, androidKeyStore).let {
it.init(
KeyGenParameterSpec.Builder(keyAlias, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setRandomizedEncryptionRequired(false)
.build()
)
it.generateKey()
}
}
Класс LogManager отправляет журнал на сервер.
ниже - журнал сервера по временной шкале. Каждый журнал означает, что вызывается application.onCreate. количество увеличивается и сохраняется в sharedPreference. я думаю, что если count = 1, это впервые. поэтому NOT_EXIST НОРМАЛЬНО.
10/ 11 2019 10:14:12.022 TEE_CHECK NOT_EXIST
count=8
10/ 11 2019 10:12:44.316 TEE_CHECK NOT_EXIST
count=7
10/ 11 2019 09:17:24.572 TEE_CHECK NOT_EXIST
count=6
ожидается - если ключ генерируется в KeyStore, он постоянно существует в KeyStore.
актуальный - ключне найдено в KeyStore.