2016-04-08 14 views
2

'da depolanan anahtar ile Şifreleme Realm Uygulamamda bir şifreli varsayılan bölge örneği kurmaya çalışıyorum. Buradaki fikir, bir takma ad ile KeyPairGenerator kullanarak bir anahtar oluşturmak, AndroidKeyStore'da saklamak ve gerektiğinde her zaman anahtarını kullanmaktır. i API sürümlerini 18 ve üzeri desteklemek gerekiyor gibi KeyPairGenerator kullanıyorumKeyStore

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(); 
     } 

:

Ben

NE Bu şimdiye anahtarı oluşturmak nasıl.

RealmConfiguration config = null; 
    try { 
     config = new RealmConfiguration 
       .Builder(this) 
       .encryptionKey(ks.getKey(KEY_ALIAS, null).getEncoded()) 
       .name("dealmatrix.realm") 
       .schemaVersion(1) 
       .build(); 

ks bir Keystore örneği şöyle elde edilir burada:: İşte

i tertibat benim Uygulamasında varsayılan bölge örneği nasıl

Keystore ks = KeyStore.getInstance("AndroidKeyStore"); 
ks.load(null); 

NE YANLIŞ

GOES Benim problemim şu ifadedir:

ks.getKey(KEY_ALIAS, null).getEncoded() 

null değerini döndürür, bu da istisnai bir şekilde istisnalara yol açar.

Bunun çevrimiçi olduğunu, bunun KeyStore sisteminin amaçlanan davranışı olduğunu okudum.

Eğer gerçekten saklanan şifreleme anahtarının bayt dizisini alamıyorsam, anahtarımı kullanarak anahtarımı nasıl şifreleyeceğim?

Şifreleme anahtarını güvenli bir şekilde depolamak için başka bir yöntem var mı, böylece bunu benim arabirim yapılandırmasında kullanabilir miyim?

+0

Herhangi bir çözüm buldunuz mu, ben de bu sorunla karşı karşıyayım – saikrupa

cevap

0

Android Keystore, getEncoded öğesinden dönen anahtarlar amaçlandığı şekilde çalışıyor. getEncoded özel anahtarın anahtar materyalini (genellikle PKCS # 8 DER kodlu formatta) veya ana malzeme dışa aktarımı desteklenmiyorsa null döndürmelidir. Android Keystore, tasarım gereği gizli veya gizli anahtarların anahtar malzemelerini açığa çıkarmaz/dışa aktarmaz ve bu nedenleEncoded değeri null değerini döndürür. Bkz https://developer.android.com/training/articles/keystore.html#SecurityFeatures.

Yine de bu anahtarları İmza ve Şifreli soyutlamalar ile kullanabilirsiniz.

+0

Tamam, anlıyorum. Söyledikleriniz mantıklı, ama bu soruya gerçekten cevap vermiyor. Benim Realm yapılandırmam için bir şifreleme anahtarını nasıl güvenli bir şekilde saklayabilirim? – Rakatan

+0

Realm nedir?Genel olarak, bir Anahtar örneği ile başlattığınız Cipher ilkelini kullanarak öğeleri şifreleyebilirsiniz. Bu durumda, Android Anahtar Mağazası'ndan bir Anahtar örneği edinebilirsiniz. –

+0

https://realm.io/. Bu bir veritabanı. Keystore'nun nasıl çalıştığının farkındayım, ancak veritabanının şifreleme yöntemi yalnızca bir bayt dizisini kabul eder. – Rakatan

İlgili konular