Last active
July 5, 2018 09:52
-
-
Save ishikota/c5e30da0e418618b0deffb8fecaf9a3d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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