Android KeyStore İle Veri Şifreleme

Taha Şalva
LCW Digital
Published in
2 min readDec 28, 2023

Android Keystore, Android uygulamalarına şifreleme ve anahtar yönetimi işlevleri sağlayan bir bileşendir. Keystore, uygulama geliştiricilerine kullanıcı verilerini güvenli bir şekilde depolamak, hassas bilgileri şifrelemek için kullanılır.

Keystore’un temel amacı, kullanıcı verilerinin güvenlik ve gizlilik açısından korunmasını sağlamaktır. Keystore, birden fazla şekilde kullanılabilir:

  1. Anahtar yönetimi: Keystore, uygulama tarafından oluşturulan ve kullanılan kriptografik anahtarları güvenli bir şekilde saklar. Bu anahtarlar, şifreleme, imza doğrulama, kimlik doğrulama ve diğer kriptografik işlemler için kullanılabilir.
  2. Veri şifreleme: Keystore, uygulama tarafından sağlanan verilerin şifrelenmesini ve şifrelenmiş verilerin çözülmesini sağlar. Bu sayede, kullanıcı verileri güvenli bir şekilde depolanabilir ve iletilen veriler güvenli bir şekilde iletilir.
  3. Anahtar kullanımı: Keystore, uygulama tarafından saklanan anahtarların güvenli bir şekilde kullanılmasını sağlar. Anahtarlar, uygulama tarafından kullanıldığında doğrudan belleğe yüklenmez ve güvenli bir şekilde kullanılmaları için Keystore tarafından yönetilir.

Hadi veri şifreleme kısmını yazalım:

Android Api level 23 ve üzeri olarak kullanabilirsiniz. Android Keystore’u kullanarak veri şifrelemek için, öncelikle bir anahtar oluşturmanız ve bu anahtarın Keystore üzerinde depolanmasını sağlamanız gerekmektedir. Daha sonra, oluşturulan anahtar kullanılarak veriyi şifreleyebilir ve şifresini çözebilirsiniz. Bu işlemler, Keystore’un sağladığı kriptografik API’ları kullanarak gerçekleştirilir.

import android.content.Context
import android.os.Build
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import java.nio.charset.StandardCharsets
import java.security.KeyStore
import javax.crypto.Cipher
import javax.crypto.KeyGenerator
import javax.crypto.SecretKey

private const val KEY_ALIAS = "MyKeyAlias"

fun main() {
// Android Keystore ile şifreleme örneği
val context: Context? = null // Gerçek bir Android Context'iyle değiştirilmelidir

// Anahtar oluşturma
createKey(context)

// Örnek veri
val originalData = "Deneme Medium"

// Veriyi şifreleme
val encryptedData = encryptData(context, originalData)

// Şifrelenmiş veriyi çözme
val decryptedData = decryptData(context, encryptedData)
}

fun createKey(context: Context?) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val keyGenerator = KeyGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_AES,
"AndroidKeyStore"
)
val keySpec = KeyGenParameterSpec.Builder(
KEY_ALIAS,
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
.build()

keyGenerator.init(keySpec)
keyGenerator.generateKey()
}
}

fun getSecretKey(): SecretKey {
val keyStore = KeyStore.getInstance("AndroidKeyStore")
keyStore.load(null)
return keyStore.getKey(KEY_ALIAS, null) as SecretKey
}

fun encryptData(context: Context?, data: String): ByteArray {
val cipher = Cipher.getInstance(
KeyProperties.KEY_ALGORITHM_AES + "/" +
KeyProperties.BLOCK_MODE_CBC + "/" +
KeyProperties.ENCRYPTION_PADDING_PKCS7
)

cipher.init(Cipher.ENCRYPT_MODE, getSecretKey())
return cipher.doFinal(data.toByteArray(StandardCharsets.UTF_8))
}

fun decryptData(context: Context?, encryptedData: ByteArray): String {
val cipher = Cipher.getInstance(
KeyProperties.KEY_ALGORITHM_AES + "/" +
KeyProperties.BLOCK_MODE_CBC + "/" +
KeyProperties.ENCRYPTION_PADDING_PKCS7
)

cipher.init(Cipher.DECRYPT_MODE, getSecretKey())
val decryptedBytes = cipher.doFinal(encryptedData)
return String(decryptedBytes, StandardCharsets.UTF_8)
}

--

--