ฉันกำลังพยายามตั้งค่าอินสแตนซ์ขอบเขตเริ่มต้นที่เข้ารหัสในแอปของฉัน แนวคิดคือการสร้างคีย์โดยใช้ KeyPairGenerator พร้อมด้วยนามแฝงที่กำหนด เก็บไว้ใน AndroidKeyStore และใช้คีย์ดังกล่าวทุกครั้งที่จำเป็น
สิ่งที่ฉันทำ
นี่คือวิธีที่ฉันสร้างคีย์:
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();
}
ฉันใช้ KeyPairGenerator เนื่องจากฉันต้องรองรับ API เวอร์ชัน 18 ขึ้นไป
นี่คือวิธีที่ฉันตั้งค่าอินสแตนซ์ขอบเขตเริ่มต้นในแอปพลิเคชันของฉัน:
RealmConfiguration config = null;
try {
config = new RealmConfiguration
.Builder(this)
.encryptionKey(ks.getKey(KEY_ALIAS, null).getEncoded())
.name("dealmatrix.realm")
.schemaVersion(1)
.build();
โดยที่ ks เป็นอินสแตนซ์ Keystore ที่ได้รับดังนี้:
Keystore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
เกิดอะไรขึ้น
ปัญหาของฉันคือนิพจน์นี้:
ks.getKey(KEY_ALIAS, null).getEncoded()
คืนค่า null ซึ่งนำไปสู่ข้อยกเว้นอย่างเข้าใจได้
ฉันได้อ่านออนไลน์แล้วว่านี่เป็นพฤติกรรมที่ตั้งใจไว้ของระบบ KeyStore
หากฉันไม่สามารถรับอาร์เรย์ไบต์ของคีย์เข้ารหัสที่เก็บไว้ได้ ฉันจะเข้ารหัสขอบเขตของฉันโดยใช้คีย์ดังกล่าวได้อย่างไร
มีวิธีอื่นใดในการจัดเก็บคีย์เข้ารหัสอย่างปลอดภัยเพื่อที่ฉันจะได้ใช้ในการกำหนดค่าขอบเขตของฉันหรือไม่