1

I want to secure the password used for Greendao db with SQLCipher. I am using a keystore to genrate a key and using that key encrypting a password getting from the server. I want to use encrypted data as a password for database. The problem is cipher every time generating different encrypted data. (I know it is working as expected). Is there any way to generate the encrypted data similar every time? I am using following code for encryption: -

 private fun generateSecureKey() {
    val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
    val keyGenParameterSpec = KeyGenParameterSpec.Builder(BuildConfig.APPLICATION_ID,
            KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
            .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
            .setRandomizedEncryptionRequired(false)
            .build()
    keyGenerator.init(keyGenParameterSpec)
    keyGenerator.generateKey()
}

private fun getSecureKeyFromKeyStore(): SecretKey {
    val keyStore = KeyStore.getInstance("AndroidKeyStore")
    keyStore.load(null)
    return if (keyStore.containsAlias(BuildConfig.APPLICATION_ID)) {
        val secretKeyEntry = keyStore.getEntry(BuildConfig.APPLICATION_ID, null) as KeyStore.SecretKeyEntry
        secretKeyEntry.secretKey
    } else {
        generateSecureKey()
        val secretKeyEntry = keyStore.getEntry(BuildConfig.APPLICATION_ID, null) as KeyStore.SecretKeyEntry
        secretKeyEntry.secretKey
    }
}

private fun encryptData(secureData: String): String {

    val cipher = Cipher.getInstance("AES/GCM/NoPadding")
    cipher.init(Cipher.ENCRYPT_MODE, getSecureKeyFromKeyStore())
    val bytes = cipher.doFinal(secureData.toByteArray())
    return Base64.encodeToString(bytes, Base64.DEFAULT)
}
DevDroid
  • 93
  • 8

0 Answers0