Skip to content

Most visited

Recently visited

navigation

Pengesahan Kunci

Pengesahan Kunci memberi Anda kepercayaan diri lebih bahwa kunci yang Anda gunakan dalam aplikasi disimpan dalam keystore yang didukung perangkat keras suatu perangkat. Bagian berikut menjelaskan tentang cara memverifikasi properti kunci yang didukung perangkat keras dan cara menginterpretasikan skema dari data ekstensi sertifikat pengesahan.

Catatan: Hanya sedikit perangkat yang menjalankan Android 7.0 (API level 24) yang mendukung pengesahan kunci tingkat-perangkat keras; semua perangkat lain yang menjalankan Android 7.0 menggunakan pengesahan kunci tingkat-perangkat lunak sebagai gantinya. Sebelum Anda memverifikasi properti kunci yang didukung perangkat keras di perangkat dalam lingkungan tingkat-produksi, Anda harus memastikan bahwa perangkat mendukung pengesahan kunci tingkat-perangkat keras. Untuk melakukannya, Anda harus memastikan bahwa rantai sertifikat pengesahan berisi sertifikat akar yang ditandatangani oleh kunci akar pengesahan Google dan bahwa elemen attestationSecurityLevel dalam struktur data keterangan kunci disetel ke tingkat keamanan TrustedEnvironment.

Mengambil dan Memverifikasi Pasangan Kunci yang Didukung Perangkat Keras

Pada saat pengesahan kunci, Anda menentukan nama alias pasangan kunci. Alat pengesahan, sebagai balasannya, menyediakan rantai sertifikat, yang bisa Anda gunakan untuk memverifikasi properti pasangan kunci tersebut.

Jika perangkat mendukung pengesahan kunci tingkat-perangkat keras, sertifikat akar dalam rantai ditandatangani menggunakan kunci akar pengesahan, yang dimasukkan produsen perangkat ke dalam keystore yang didukung perangkat keras dari perangkat di pabrik pembuatan.

Catatan: Pada perangkat yang dijual dengan pengesahan kunci tingkat-perangkat keras, Android 7.0 (API level 24), dan Google Play Services, sertifikat akar ditandatangani oleh kunci akar pengesahan Google. Anda harus memverifikasi bahwa sertifikat akar ini muncul dalam daftar Google tentang sertifikat akar.

Untuk mengimplementasikan pengesahan kunci, lakukan langkah-langkah berikut:

  1. Gunakan objek KeyStore metode getCertificateChain() untuk mendapatkan referensi ke rantai sertifikat X.509 yang terkait dengan keystore yang didukung perangkat keras.
  2. Periksa validitas setiap sertifikat menggunakan objek CRL metode isRevoked().

    Perhatian: Meskipun Anda bisa menyelesaikan proses ini dalam aplikasi Anda secara langsung, lebih aman jika memeriksa daftar pencabutan sertifikat pada server terpisah yang Anda percaya.

  3. Buat objek Attestation, teruskan elemen pertama dari rantai sertifikat sebagai argumen:

    // "certificates" contains the certificate chain associated with a specific key
    // pair in the device's hardware-backed keystore.
    X509Certificate attestationCert = (X509Certificate) certificates[0];
    Attestation hardwareKeyAttestation = new Attestation(attestationCert);
    

    Sebuah objek pengesahan mengekstrak data ekstensi dalam sertifikat dan menyimpan informasi ini dalam format yang lebih mudah diakses. Untuk detail selengkapnya tentang skema data ekstensi, lihat Skema Data Ekstensi Sertifikat.

  4. Gunakan metode pengakses dalam kelas Attestation untuk mengambil data ekstensi dari sertifikat. Metode ini menggunakan nama yang sama dan hierarki struktur seperti pada skema data ekstensi sertifikat.

    Misalnya, untuk melihat kunci booting terverifikasi untuk TEE perangkat, gunakan urutan metode berikut:

    // "hardwareKeyAttestation" contains the first element of the attestation
    // certificate chain.
    AuthorizationList teeAuthList = hardwareKeyAttestation.getTeeEnforced();
    RootOfTrust teeRootOfTrust = teeAuthList.getRootOfTrust();
    byte[] teeVerifiedBootKey = teeRootOfTrust.getVerifiedBootKey();
    
  5. Membandingkan data ekstensi dari objek Attestation dengan kumpulan nilai yang Anda harapkan dimuat oleh kunci yang didukung perangkat keras.

    Perhatian: Meskipun Anda bisa menyelesaikan proses ini dalam aplikasi secara langsung, lebih aman jika memeriksa data ekstensi sertifikat pada server terpisah yang Anda percaya.

Skema Data Ekstensi Sertifikat

Pengesahan kunci akan memverifikasi data ekstensi yang muncul di sertifikat pertama dalam rantai di keystore yang didukung perangkat keras dari perangkat ini. Sertifikat menyimpan informasi menurut sesuai dengan skema ASN.1 berikut:

KeyDescription ::= SEQUENCE {
    attestationVersion  INTEGER,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    reserved  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    teeEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    applicationId  [601] EXPLICIT OCTET_STRING OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationChallenge  [708] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Daftar berikut menampilkan keterangan dari setiap elemen dalam skema:

KeyDescription

Urutan nilai ini menampilkan informasi umum tentang pasangan kunci yang diverifikasi melalui pengesahan kunci dan menyediakan akses mudah ke detail tambahan.

attestationVersion
Versi fitur pengesahan kunci. Harus disetel ke 1.
attestationSecurityLevel

Tingkat keamanan dari pengesahan.

Peringatan: Meskipun dimungkinkan untuk mengesahkan kunci yang disimpan dalam sistem Android—yaitu, jika nilai attestationSecurityLevel disetel ke Software—Anda tidak bisa mempercayai pengesahan ini jika sistem Android menjadi terganggu.

keymasterVersion
Versi Keymaster Hardware Abstraction Layer (HAL). Gunakan 0 untuk menyatakan versi 0.2 atau 0.3, 1 untuk menyatakan versi 1.0, dan 2 untuk menyatakan versi 2.0.
keymasterSecurityLevel
Tingkat keamanan dari implementasi Keymaster.
attestationChallenge
Penolakan string yang dihubungkan dengan pasangan kunci yang diverifikasi menggunakan pengesahan kunci.
reserved
Hanya aplikasi sistem yang menggunakan nilai ini. Dalam semua aplikasi lainnya, nilai ini kosong.
softwareEnforced
Opsional. Daftar otorisasi Keymaster yang diberlakukan oleh sistem Android, bukan oleh TEE perangkat.
teeEnforced
Opsional. Daftar otorisasi Keymaster yang diberlakukan oleh TEE perangkat.

SecurityLevel

Struktur data ini menunjukkan sejauh mana fitur perangkat lunak, seperti pasangan kunci, dilindungi berdasarkan lokasi dalam perangkat.

Karena struktur data adalah enumerasi, itu menggunakan persis salah satu dari nilai berikut:

Software
Logika untuk membuat dan mengelola fitur ini diimplementasikan dalam sistem Android. Untuk keperluan pembuatan dan storage pasangan kunci, lokasi ini kurang aman dibandingkan TEE namun lebih aman daripada ruang proses aplikasi Anda.
TrustedEnvironment
Logika untuk membuat dan mengelola fitur ini diimplementasikan dalam perangkat keras yang aman, seperti TEE. Untuk keperluan pembuatan dan storage pasangan kunci, lokasi ini lebih aman karena perangkat keras yang aman sangat tahan terhadap ancaman keamanan jarak jauh.

AuthorizationList

Struktur data ini berisi properti pasangan kunci, seperti yang didefinisikan dalam Keymaster Hardware Abstraction Layer (HAL). Anda membandingkan nilai ini dengan status perangkat saat ini atau dengan kumpulan nilai yang diharapkan untuk memverifikasi bahwa pasangan kunci masih valid untuk digunakan dalam aplikasi Anda.

Setiap nama bidang berkaitan dengan tag Keymaster yang bernama sama. Misalnya, bidang keySize dalam daftar otorisasi berkaitan dengan tag Keymaster KM_TAG_KEY_SIZE.

Setiap bidang dalam daftar berikut bersifat opsional:

purpose
Berkaitan dengan tag Keymaster KM_TAG_PURPOSE, yang menggunakan ID tag bernilai 1.
algorithm

Berkaitan dengan tag Keymaster KM_TAG_ALGORITHM, yang menggunakan ID tag bernilai 2.

Bila objek AuthorizationList dikaitkan dengan pengesahan kunci, nilainya akan selalu KM_ALGORITHM_RSA atau KM_ALGORITHM_EC.

keySize
Berkaitan dengan tag Keymaster KM_TAG_KEY_SIZE, yang menggunakan ID tag bernilai 3.
digest
Berkaitan dengan tag Keymaster KM_TAG_DIGEST, yang menggunakan ID tag bernilai 5.
padding
Berkaitan dengan tag Keymaster KM_TAG_PADDING, yang menggunakan ID tag bernilai 6.
ecCurve

Berkaitan dengan tag Keymaster KM_TAG_EC_CURVE, yang menggunakan ID tag bernilai 10.

Kumpulan parameter yang digunakan untuk menghasilkan elliptic curve (EC) pasangan kunci, yang menggunakan ECDSA untuk menandatangani dan verifikasi, dalam keystore sistem Android.

rsaPublicExponent
Berkaitan dengan tag Keymaster KM_TAG_RSA_PUBLIC_EXPONENT, yang menggunakan ID tag bernilai 200.
activeDateTime
Berkaitan dengan tag Keymaster KM_TAG_ACTIVE_DATETIME, yang menggunakan ID tag bernilai 400.
originationExpireDateTime
Berkaitan dengan tag Keymaster KM_TAG_ORIGINATION_EXPIRE_DATETIME, yang menggunakan ID tag bernilai 401.
usageExpireDateTime
Berkaitan dengan tag Keymaster KM_TAG_USAGE_EXPIRE_DATETIME, yang menggunakan ID tag bernilai 402.
noAuthRequired

Berkaitan dengan tag Keymaster KM_TAG_NO_AUTH_REQUIRED, yang menggunakan ID tag bernilai 503.

Bila objek AuthorizationList dikaitkan dengan pengesahan kunci, nilainya selalu true.

userAuthType
Berkaitan dengan tag Keymaster KM_TAG_USER_AUTH_TYPE, yang menggunakan ID tag bernilai 504.
authTimeout
Berkaitan dengan tag Keymaster KM_TAG_AUTH_TIMEOUT, yang menggunakan ID tag bernilai 505.
allowWhileOnBody

Berkaitan dengan tag Keymaster KM_TAG_ALLOW_WHILE_ON_BODY, yang menggunakan ID tag bernilai 506.

Memungkinkan kunci untuk digunakan setelah periode waktu tunggu autentikasi jika pengguna masih mengenakan perangkat di tubuh mereka. Perhatikan bahwa sensor pada tubuh yang aman menentukan apakah perangkat sedang dikenakan pada tubuh pengguna.

Bila objek AuthorizationList dikaitkan dengan pengesahan kunci, nilainya selalu true.

allApplications

Berkaitan dengan tag Keymaster KM_TAG_ALL_APPLICATIONS, yang menggunakan ID tag bernilai 600.

Menunjukkan apakah semua aplikasi pada perangkat bisa mengakses pasangan kunci.

Bila objek AuthorizationList dikaitkan dengan pengesahan kunci, nilainya selalu true.

applicationId
Berkaitan dengan tag Keymaster KM_TAG_APPLICATION_ID, yang menggunakan ID tag bernilai 601.
creationDateTime
Berkaitan dengan tag Keymaster KM_TAG_CREATION_DATETIME, yang menggunakan ID tag bernilai 701.
origin

Berkaitan dengan tag Keymaster KM_TAG_ORIGIN, yang menggunakan ID tag bernilai 702.

Bila objek AuthorizationList dikaitkan dengan pengesahan kunci, nilai ini biasanya disetel ke KM_ORIGIN_GENERATED. Namun jika pengesahan menggunakan Keymaster versi 0.2 atau 0.3, sumber dapat disetel ke KM_ORIGIN_UNKNOWN sebagai gantinya.

rollbackResistant
Berkaitan dengan tag Keymaster KM_TAG_ROLLBACK_RESISTANT, yang menggunakan ID tag bernilai 703.
rootOfTrust

Berkaitan dengan tag Keymaster KM_TAG_ROOT_OF_TRUST, yang menggunakan ID tag bernilai 704.

Untuk detail selengkapnya, lihat bagian yang menjelaskan struktur data RootOfTrust.

osVersion

Berkaitan dengan tag Keymaster KM_TAG_OS_VERSION, yang menggunakan ID tag bernilai 705.

Versi dari sistem operasi Android yang berhubungan dengan Keymaster, ditetapkan sebagai integer enam digit. Misalnya, versi 6.0.1 ditampilkan sebagai 060001.

Hanya Keymaster versi 1.0 atau yang lebih tinggi yang menyertakan nilai ini dalam daftar otorisasi.

osPatchLevel

Berkaitan dengan tag Keymaster KM_TAG_PATCHLEVEL, yang menggunakan ID tag bernilai 706.

Bulan dan tahun terkait dengan patch keamanan yang digunakan dalam Keymaster, ditetapkan sebagai integer enam digit. Misalnya, patch Juni 2016 ditampilkan sebagai 201606.

Hanya Keymaster versi 1.0 atau yang lebih tinggi yang menyertakan nilai ini dalam daftar otorisasi.

attestationChallenge

Berkaitan dengan tag Keymaster KM_TAG_ATTESTATION_CHALLENGE, yang menggunakan ID tag bernilai 708.

Penolakan string yang terkait dengan pasangan kunci akan didefinisikan dalam Keymaster.

attestationApplicationId

Berkaitan dengan tag Keymaster KM_TAG_ATTESTATION_APPLICATION_ID, yang menggunakan ID tag bernilai 709.

ID unik dari sertifikat pengesahan yang telah menandatangani pasangan kunci yang ada di Keymaster.

RootOfTrust

Kumpulan nilai ini mendefinisikan informasi penting tentang status perangkat.

Setiap bidang dalam daftar berikut bersifat wajib:

verifiedBootKey

Hash aman dari kunci yang memverifikasi citra sistem. Disarankan agar Anda menggunakan algoritme SHA-256 untuk hash ini.

deviceLocked
Bernilai True jika bootloader perangkat terkunci, yang memungkinkan Verified Boot memeriksa dan mencegah gambar perangkat yang tidak terdaftar agar tidak di-flash ke perangkat. Untuk informasi selengkapnya tentang fitur ini, lihat dokumentasi Memverifikasi Booting.
verifiedBootState
Status booting perangkat, sesuai dengan fitur Verified Boot.
osVersion
Versi dari sistem operasi Android saat ini pada perangkat, ditetapkan sebagai integer enam digit. Misalnya, versi 6.0.1 ditampilkan sebagai 060001.
patchMonthYear
Bulan dan tahun yang terkait dengan patch keamanan yang saat ini terpasang pada perangkat, ditetapkan sebagai integer enam digit. Misalnya, patch Agustus 2016 ditampilkan sebagai 201608.

VerifiedBootState

Struktur data ini memberikan status booting perangkat saat ini, yang merepresentasikan tingkat perlindungan yang diberikan ke pengguna dan aplikasi setelah perangkat menyelesaikan booting. Untuk informasi selengkapnya tentang fitur ini, lihat bagian Boot State dalam dokumentasi Memverifikasi Booting.

Struktur data ini adalah enumerasi, jadi struktur ini menggunakan dengan tepat salah satu nilai berikut:

Verified

Menunjukkan rantai kepercayaan lengkap, yang meliputi bootloader, partisi booting, dan semua partisi terverifikasi.

Bila perangkat berada dalam status booting ini, verifiedBootKey adalah hash dari sertifikat tersemat-perangkat, yang ditambahkan produsen ke ROM perangkat di pabrik.

SelfSigned

Menunjukkan bahwa sertifikat tersemat-perangkat telah memverifikasi partisi booting perangkat dan bahwa tanda tangan tersebut valid.

Bila perangkat berada dalam status booting ini, verifiedBootKey adalah hash dari sertifikat yang dipasang pengguna, yang menandatangani partisi booting yang ditambahkan pengguna ke perangkat sebagai pengganti yang asli, partisi booting yang disediakan pembuat.

Unverified
Menunjukkan bahwa pengguna bisa memodifikasi perangkat secara bebas. Karenanya, pengguna bertanggung jawab untuk memverifikasi integritas perangkat.
Failed
Menunjukkan bahwa perangkat gagal diverifikasi. Sertifikat pengesahan tidak boleh menggunakan nilai ini untuk VerifiedBootState.
This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Ikuti Google Developers di WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)