Saya mencoba menyiapkan instance ranah default terenkripsi di aplikasi saya. Idenya adalah membuat kunci menggunakan KeyPairGenerator dengan alias tertentu, menyimpannya di AndroidKeyStore dan menggunakan kunci tersebut setiap kali diperlukan.
APA YANG SAYA LAKUKAN
Inilah cara saya menghasilkan kunci:
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
if (!ks.containsAlias(KEY_ALIAS)) {
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
end.add(Calendar.YEAR, 99);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(this)
.setAlias(KEY_ALIAS)
.setSubject(new X500Principal("CN=Example, O=ExampleOrg"))
.setSerialNumber(BigInteger.ONE)
.setStartDate(start.getTime())
.setEndDate(end.getTime())
.build();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
generator.initialize(spec);
KeyPair keyPair = generator.generateKeyPair();
}
Saya menggunakan KeyPairGenerator karena saya perlu mendukung api versi 18 dan lebih tinggi.
Inilah cara saya mengatur instance ranah default di Aplikasi saya:
RealmConfiguration config = null;
try {
config = new RealmConfiguration
.Builder(this)
.encryptionKey(ks.getKey(KEY_ALIAS, null).getEncoded())
.name("dealmatrix.realm")
.schemaVersion(1)
.build();
di mana ks adalah instance Keystore yang diperoleh seperti:
Keystore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
APA YANG SALAH
Masalah saya adalah ungkapan ini:
ks.getKey(KEY_ALIAS, null).getEncoded()
mengembalikan null, yang tentu saja mengarah pada pengecualian.
Saya telah membaca secara online bahwa ini adalah perilaku yang diinginkan dari sistem KeyStore.
Jika memang saya tidak bisa mendapatkan array byte kunci enkripsi yang disimpan, bagaimana saya bisa mengenkripsi wilayah saya menggunakan kunci tersebut?
Apakah ada metode lain untuk menyimpan kunci enkripsi dengan aman sehingga saya dapat menggunakannya dalam konfigurasi ranah saya?