Skip to content

Instantly share code, notes, and snippets.

@ishikota
Last active July 5, 2018 09:52
Show Gist options
  • Save ishikota/c5e30da0e418618b0deffb8fecaf9a3d to your computer and use it in GitHub Desktop.
Save ishikota/c5e30da0e418618b0deffb8fecaf9a3d to your computer and use it in GitHub Desktop.
fun savePrivateString(key: String, value: String) {
prefs.edit().putString(key, encrypt(key, value)).apply()
}
fun getPrivateString(key: String): String {
val encrypted = prefs.getString(key, "")
return decrypt(key, encrypted)
}
private fun encrypt(alias: String, plain: String): String {
val cipher = initializeCipher(alias, Cipher.ENCRYPT_MODE)
val encrypted = cipher.doFinal(plain.toByteArray()) ?: byteArrayOf() // TODO catch exception
return Base64.encodeToString(encrypted, Base64.DEFAULT)
}
private fun decrypt(alias: String, encrypted: String): String {
val cipher = initializeCipher(alias, Cipher.DECRYPT_MODE)
val decrypted = cipher.doFinal(plain.toByteArray()) ?: byteArrayOf() // TODO catch exception
return String(decrypted)
}
private fun initializeCipher(alias: String, mode: Int) = Cipher.getInstance("$ALGORITHM/$MODE/$PADDING").apply {
val iv = BuildConfig.CIPHER_IV // InitializationVector. 16bytes string.
val secretKeySpec = buildSecretKey(alias)
val ivSpec = IvParameterSpec(iv.toByteArray())
init(mode, secretKeySpec, ivSpec)
}
private fun buildSecretKey(alias: String): SecretKey {
val keystore = KeyStore.getInstance("AndroidKeyStore").apply { load(null) }
return if (keystore.containsAlias(alias)) { // use saved secretKey
val entry = (keystore.getEntry(keyAlias, null) as KeyStore.SecretKeyEntry)
entry.secretKey
} else { // generate new secretKey and save it into AndroidKeyStore
val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
keyGenerator.init(KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
.build())
return keyGenerator.generateKey()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment