Keystore у Android-у — шта је то, архитектура и криптографија

Аутор: IT Sectr Објављено: 2026-04-04 Време читања: 9 мин

Android Keystore — криптографски провајдер који генерише и чува кључеве енкрипције у изолованом окружењу за извршавање (TEE), недоступном чак и за оперативни систем. Према AOSP Security Documentation (2025), Keystore се користи у преко 80% Android апликација из топ 100 Google Play за заштиту токена и енкрипцију података. Разумевање Android Keystore је критично важно за безбедно чување кључева на Android-у.

Главно

  • Android Keystore — системски провајдер за генерисање и чување криптографских кључева у хардверски изолованом окружењу (TEE).
  • StrongBox Keymaster — посебан чип безбедности са сопственим CPU и TRNG, сертификован према Common Criteria EAL 4+.
  • KeyGenParameterSpec — конфигуратор за постављање алгоритма, величине кључа, биометријског повезивања и рока трајања.
  • TEE (Trusted Execution Environment) — изолована област процесора у којој се криптографске операције извршавају без приступа из корисничког простора.
  • Кључеви из Keystore-а се не могу извући — приватни кључ никада не напушта TEE или StrongBox, чак ни развојач апликације га не може прочитати.

Шта је Keystore у Android-у?

Android Keystore — системска компонента платформе Android која пружа API за генерисање, чување и коришћење криптографских кључева у заштићеном окружењу. За разлику од софтверских криптографских библиотека (Bouncy Castle, Conscrypt), Keystore гарантује да приватни кључеви никада не напуштају изоловану област извршавања.

Keystore се појавио у Android 4.3 (API 18) као софтверски провајдер са подршком за RSA. Почевши од Android 6.0 (API 23), Keystore је добио хардверску подршку кроз Keymaster Hardware Abstraction Layer (HAL), која делегира криптографске операције Trusted Execution Environment (TEE) на компатибилним уређајима. Према Android Compatibility Definition Document (2025), сви уређаји са Android 9+ морају да подржавају хардверски Keystore кроз TEE или StrongBox.

Кључеви у Keystore-у се идентификују по псеудониму (alias) — низу која се прослеђује приликом креирања или учитавања кључа. Keystore не дозвољава добијање сировог материјала кључа: методе getEncoded() враћају null за кључеве креиране у Keystore-у. Ово је фундаментална разлика у односу на софтверске кључеве — нападач не може да извуче приватни кључ чак и уз потпуну контролу над уређајем.

Keystore је интегрисан са другим механизмима безбедности Android-а: биометријском аутентификацијом (BiometricPrompt), енкрипцијом на нивоу датотека (File-Based Encryption) и функцијама потврде SafetyNet / Play Integrity. Кључеви могу бити подешени за аутоматско брисање под одређеним условима: при уклањању лозинке, при додавању новог отиска прста или по истеку рока трајања.

Архитектура Android Keystore

Архитектура Android Keystore укључује три нивоа имплементације који се разликују у степену хардверске заштите. Ниво зависи од хардверских могућности уређаја.

Hardware-backed Keystore (TEE)

TEE (Trusted Execution Environment) — изолована област која ради паралелно са главним оперативним системом на истом процесору. TEE користи ARM TrustZone технологију, која дели физичко језгро процесора на два виртуелна: Normal World (Android) и Secure World (TEE). Код у Secure World-у има приступ меморији и периферији који су недоступни из Normal World-а.

Када апликација позове криптографску операцију кроз Keystore, захтев се прослеђује кроз Keymaster HAL у TEE, где се операција извршава хардверски. Резултат се враћа у апликацију, али приватни кључ остаје у заштићеној меморији TEE-а. TEE је сертификован према GlobalPlatform TEE Protection Profile и представља обавезан захтев за Android 9+ на уређајима са процесорима који подржавају TrustZone.

TEE подржава алгоритме AES/GCM (128, 256 бита), RSA (2048, 4096 бита), EC (P-256, P-384, P-521) и HMAC-SHA256. Перформансе TEE-а је нижи од софтверске криптографије (за 20–40%), али за типичне операције (потпис JWT, декрипција кључа сесије) кашњење не прелази 10–50 ms.

StrongBox Keymaster

StrongBox — посебан чип безбедности, физички одвојен од главног процесора. За разлику од TEE-а, који дели процесорско време са Androidом, StrongBox има сопствени CPU, RAM, генератор правих случајних бројева (TRNG) и заштићено складиште (One-Time Programmable memory). StrongBox је сертификован према Common Criteria EAL 4+ и Secure IC Protection Profile.

StrongBox је доступан на уређајима са Android 9+ уз услов постојања одговарајућег чипа (нпр. Titan M на Google Pixel, Knox на Samsung Galaxy). Развојач укључује StrongBox путем флага setIsStrongBoxBacked(true) у KeyGenParameterSpec-у. У одсуству хардверске подршке, флаг се игнорише и Keystore прелази на TEE.

Ограничења StrongBox-а: подржава ограничени скуп алгоритама (AES-256, EC P-256, HMAC-SHA256), ред операција — највише једна истовремено, број операција — ограничен ресурсима чипа. StrongBox није предвиђен за сценарије са високим оптерећењем — користите TEE за честе операције, а StrongBox само за критичне кључеве (мастер кључеви енкрипције, кључеви потписа).

Software-based Keystore

Software-based Keystore — софтверска имплементација која се користи на уређајима без хардверске подршке TEE или StrongBox. Кључеви се чувају у шифрованом облику у датотечном систему, али приватни кључ може бити привремено дешифрован у RAM-у. Софтверски Keystore је мање безбедан — нападач са root приступом може да пресретне кључ у меморији.

Почевши од Android 12 (API 31), Google захтева хардверску подршку Keystore-а за све нове уређаје. Уређаји са Android 9–11 могу имати софтверски Keystore на буџетним моделима. Развојач може да провери ниво заштите путем KeyStore.getKeyCharacteristics() — атрибут SECURITY_LEVEL_TRUSTED_ENVIRONMENT или SECURITY_LEVEL_STRONGBOX потврыјује хардверску заштиту.

Подржани алгоритми и функције

Android Keystore подржава широк скуп криптографских алгоритама подељених у категорије у зависности од типа кључа. Избор алгоритма утиче на перформансе, компатибилност и ниво безбедности.

AES (Advanced Encryption Standard) — симетрична енкрипција за заштиту података на уређају. Препоручује се режим: AES/GCM/NoPadding (256 бита). GCM пружа аутентификовану енкрипцију (AEAD) — проверу интегритета шифрованих података. Величина IV (иницијализациони вектор): 12 бајтова за GCM. Не користите AES/ECB — не пружа одговарајућу заштиту.

RSA (Rivest–Shamir–Adleman) — асиметрична енкрипција за заштиту кључева сесије и дигиталног потписа. Препоручује се величина: 2048 или 4096 бита. Режими: RSA/ECB/PKCS1Padding (енкрипција) и RSA/ECB/PKCS1Sign (потпис). RSA 1024 се сматра застарелим и не препоручује се за нове апликације (NIST SP 800-131A Rev. 2).

EC (Elliptic Curve) — асиметрична криптографија на елиптичким кривама за потпис и размену кључева. Подржане криве: secp256r1 (P-256, обавезна), secp384r1 (P-384) и secp521r1 (P-521). EC пружа упоредиву безбедност са RSA уз значно мању величину кључа. P-256 се препоручује за већину сценарија: подржавају је сви уређаји и пружа 128-битни ниво безбедности.

HMAC (Hash-based Message Authentication Code) — симетрична аутентификација порука. Подржане хеш функције: SHA-256, SHA-384, SHA-512. HMAC се користи за проверу интегритета и аутентичности података, нпр. за верификацију webhook захтева или проверу интегритета конфигурације.

Сви алгоритми могу бити повезани са биометријском аутентификацијом кроз KeyGenParameterSpec.Builder.setUserAuthenticationRequired(true). На Android 11+ доступан је флаг setUserAuthenticationParameters() са наводом тајмаута (у секундама) током којег је кључ доступан након биометријске аутентификације, без поновног захтева.

Примери кода: генерисање и коришћење кључева

Размотримо практичне примере рада са Android Keystore у Kotlin-у: генерисање AES кључа, шифровање података и креирање асиметричног пара за потпис.

Генерисање AES кључа у Keystore-у

Пример креира 256-битни AES/GCM кључ са повезивањем на биометријску аутентификацију. Кључ је недоступан за извоз кроз getEncoded().

kotlin
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import java.security.KeyStore

private val keyStore = KeyStore.getInstance("AndroidKeyStore").apply { load(null) }

fun generateAesKey(alias: String) {
    val spec = KeyGenParameterSpec.Builder(
        alias,
        KeyProperties.PURPOSE_ENCRYPT or
        KeyProperties.PURPOSE_DECRYPT
    )
    .setKeySize(256)
    .setBlockModes(KeyProperties.KEY_BLOCK_MODE_GCM)
    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
    .setUserAuthenticationRequired(true)
    .setInvalidatedByBiometricEnrollment(true)
    .build()

    val generator = KeyGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_AES,
        "AndroidKeyStore"
    )
    generator.init(spec)
    generator.generateKey()
}

Шифровање података AES/GCM

Пример шифрује податке користећи кључ из Android Keystore-а. Cipher добија кључ по алијасу, иницијализује AES/GCM шифровање и враћа шифроване податке заједно са IV.

kotlin
fun encryptData(alias: String, plaintext: ByteArray): ByteArray {
    val cipher = Cipher.getInstance("AES/GCM/NoPadding")
    val secretKey = keyStore.getKey(alias, null) as SecretKey
    cipher.init(Cipher.ENCRYPT_MODE, secretKey)

    val iv = cipher.getIV()
    val encrypted = cipher.doFinal(plaintext)

    // IV + шифровани подаци
    return iv + encrypted
}

fun decryptData(alias: String, ciphertextWithIv: ByteArray): ByteArray {
    val iv = ciphertextWithIv.copyOfRange(0, 12)
    val encrypted = ciphertextWithIv.copyOfRange(12, ciphertextWithIv.size)

    val cipher = Cipher.getInstance("AES/GCM/NoPadding")
    val secretKey = keyStore.getKey(alias, null) as SecretKey
    val spec = GCMParameterSpec(128, iv)
    cipher.init(Cipher.DECRYPT_MODE, secretKey, spec)

    return cipher.doFinal(encrypted)
}

Генерисање RSA пара за потпис

Пример креира пар RSA-2048 кључева у Keystore-у са повезивањем на StrongBox. Приватни кључ се користи за потпис, јавни кључ се може извести кроз getEncoded().

kotlin
fun generateRsaKeyPair(alias: String) {
    val spec = KeyGenParameterSpec.Builder(
        alias,
        KeyProperties.PURPOSE_SIGN or
        KeyProperties.PURPOSE_VERIFY
    )
    .setKeySize(2048)
    .setSignaturePaddings(
        KeyProperties.SIGNATURE_PADDING_RSA_PKCS1
    )
    .setDigests(KeyProperties.DIGEST_SHA256)
    .setIsStrongBoxBacked(true)
    .build()

    val pair = KeyPairGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_RSA,
        "AndroidKeyStore"
    ).apply { init(spec) }
     .generateKeyPair()

    // Јавни кључ се може извести
    val publicKey = pair.public // X509EncodedKeySpec
}

Најбоље праксе рада са Android Keystore

Ефикасно коришћење Android Keystore захтева поштовање правила која осигуравају максималну заштиту уз одржавање перформанси.

Користите KeyGenParameterSpec са минимално потребним параметрима: наведите само оне purpose, block modes и paddings који су стварно у употреби. Прекомерни параметри (нпр. PURPOSE_ENCRYPT за кључ који се користи само за потпис) стварају додатне векторе напада. Android препоручује јасно наведение digest-а за потпис — SHA256 је минимални дозвољени ниво (SHA1 је застарео).

Повежите кључеве са биометријом за критичне операције: setUserAuthenticationRequired(true) гарантује да се кључ може користити само након биометријске аутентификације. На Android 11+ користите setUserAuthenticationParameters() са тајмаутом (препоручује се 30–60 секунди) да не бисте захтевали биометрију за сваку операцију у оквиру једне сесије. setInvalidatedByBiometricEnrollment(true) аутоматски брише кључ при додавању новог отиска или лица — ово спречава приступ по старим биометријским подацима.

Проверите ниво безбедности при иницијализацији: користите KeyStore.getKeyCharacteristics() за одређивање SECURITY_LEVEL. Ако уређај подржава само софтверски Keystore (SECURITY_LEVEL_SOFTWARE), донесите одлуку: или одустаните од функционалности, или користите додатну енкрипцију (нпр. омотавање кључа лозинком корисника). Не ослањајте се на StrongBox ако није загарантован — увек наведите флаг setIsStrongBoxBacked(true) и проверите резултат кроз getKeyCharacteristics.

Ажурирајте кључеве по распореду: криптографски кључеви имају препоручени век трајања. NIST SP 800-57 препоручује мењање AES кључева сваке 1–2 године, RSA/EC парова сваке 2–3 године. Имплементирајте механизам ротације кључева: при покретању апликације проверите датум креирања кључа (KeyGenParameterSpec.Builder.setKeyValidityStart/End) и генеришите нови кључ по истеку рока. Стари подаци шифровани старим кључем морају бити дешифровани и поново шифровани новим.

Не користите Keystore за велике податке: Keystore је намењен за чување кључева (неколико стотина бајтова), а не за шифровање великих датотека. За шифровање података користите шему: генеришите случајни AES кључ (DEK — Data Encryption Key), шифрујте податке овим кључем, а DEK шифрујте Keystore кључем (KEK — Key Encryption Key). Android EncryptedSharedPreferences користи управо ову шему: мастер кључ у Keystore-у, подаци — AES-256 GCM.

Често постављана питања

Може ли се добити приватни кључ из Android Keystore-а?

Не, Android Keystore је пројектован тако да приватни кључ никада не напушта TEE или StrongBox. Метод getEncoded() враћа null за кључеве креиране у Keystore-у. Кључ се може користити само кроз Cipher, Signature или Mac API — сирови материјал је недоступан.

Која је разлика између TEE и StrongBox-а?

TEE (TrustZone) — виртуелна изолација на истом процесору, користи поделу времена. StrongBox — одвојен чип са сопственим CPU и меморијом. StrongBox је сигурнији (Common Criteria EAL 4+), али спорији и подржава мање алгоритама. TEE је погодан за честе операције, StrongBox — за критичне кључеве.

Како проверити да ли уређај подржава StrongBox?

Користите KeyStore.getKeyCharacteristics() након генерисања кључа са флагом setIsStrongBoxBacked(true). Атрибут SECURITY_LEVEL_STRONGBOX потврыјује хардверску подршку. Ако уређај не подржава StrongBox, Keystore без грешке прелази на TEE — потребно је јасно проверити ниво безбедности.

Шта се дешава са кључевима при брисању апликације?

Кључеви у Keystore-у се аутоматски бришу приликом брисања апликације са уређаја. На Android 10+ кључеви могу остати ако апликација има флаг allowBackup=true у манифесту, али ће бити недоступни након поновне инсталације. Препоручује се генерисање нових кључева при чистој инсталацији.

Може ли се користити један кључ на више уређаја?

Не, Android Keystore је везан за хардвер одређеног уређаја. Кључ генерисан у TEE-у једног уређаја не може се пренети на други. За међуплатформску енкрипцију користите шему: Keystore штити кључ на уређају, а кључеви сесије се преносе кроз заштићени API са асиметричном енкрипцијом.

Закључак

  • Android Keystore — системски провајдер за заштиту криптографских кључева у хардверски изолованом окружењу (TEE или StrongBox).
  • TEE (TrustZone) — виртуелна изолација на истом процесору, обавезна за Android 9+ на уређајима са TrustZone.
  • StrongBox — посебан чип безбедности са сертификатом Common Criteria EAL 4+, укључује се кроз setIsStrongBoxBacked(true).
  • KeyGenParameterSpec — централна класа за конфигурацију параметара кључа: алгоритам, величина, биометријско повезивање и ротација.
  • Кључеви се не могу извући — приватни материјал је недоступан кроз getEncoded(), операције се извршавају унутар TEE/StrongBox.
  • Препоручени алгоритми — AES/GCM/NoPadding (256 бита) за енкрипцију, EC P-256 за потпис, RSA 2048 за асиметричне сценарије.
  • Шема KEK/DEK — Keystore чува мастер кључ за заштиту кључева за шифровање података, осигуравајући перформансе и безбедност.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође