2016-04-08 10 views
2

私のアプリケーションに暗号化されたデフォルト領域のインスタンスを設定しようとしています。 アイデアはKeyPairGeneratorを使用して特定のエイリアスを使用して鍵を生成し、のAndroidKeyStoreに格納し、必要なときにその鍵を使用することです。KeyStoreにキーが格納された領域を暗号化する

私は何をすべきか

これは私が鍵を生成する方法である:

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

私はAPIバージョン18とをサポートする必要があるとして、私はするKeyPairGeneratorを使用しています。

KSはそうのように取得キーストアのインスタンスである
RealmConfiguration config = null; 
    try { 
     config = new RealmConfiguration 
       .Builder(this) 
       .encryptionKey(ks.getKey(KEY_ALIAS, null).getEncoded()) 
       .name("dealmatrix.realm") 
       .schemaVersion(1) 
       .build(); 

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

WRONG

をGOES WHATここ

は、私のアプリケーションでどのように私のセットアップ私のデフォルトのレルムのインスタンスをあります私の問題は、この式は次のとおりです。

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

はnullを返します。これは明らかに例外につながります。

私はこれがKeyStoreシステムの意図された動作であることをオンラインで読んでいます。

実際に私は格納された暗号化キーのバイト配列を取得できない場合、どのように私の領域を暗号化すると思いますか?

暗号化キーを安全に保存して、自分のレルム構成で使用する方法はありますか?

+0

あなたは解決策を見つけましたか、この問題に直面しています – saikrupa

答えて

0

getEncodedからnullを返すAndroidキーストアキーが意図したとおりに動作しています。 getEncodedは、秘密鍵のキーマテリアル(通常はPKCS#8 DERエンコード形式)を返します。キーマテリアルのエクスポートがサポートされていない場合はnullを返します。 Androidキーストアは設計上、プライベートキーまたは秘密キーのキーマテリアルを表示/エクスポートしないため、getEncodedはnullを返します。 https://developer.android.com/training/articles/keystore.html#SecurityFeaturesを参照してください。

SignatureとCipherの抽象化でこれらのキーを使用することは可能です。

+0

わかりました。あなたが言うことは意味をなさないが、これは本当に私の質問に答えるものではない。 Realm設定の暗号化キーを安全に保存するにはどうしたらいいですか? – Rakatan

+0

レルムとは一般的に、Keyインスタンスで初期化するCipherプリミティブを使用して物を暗号化できます。この場合、AndroidキーストアからKeyインスタンスを取得できます。 –

+0

https://realm.io/。それはデータベースです。 Keystoreの仕組みはわかっていますが、データベースの暗号化メソッドはバイト配列しか受け付けません。 – Rakatan

0

feature/example/store_passwordには、Androidキーストアを使用したRealmリポジトリにWIPサンプルプロジェクトがあります。

https://github.com/realm/realm-java/tree/feature/example/store_password/examples/StoreEncryptionPassword

コア・ロジックは、我々は、この例のプロジェクトをリリースする前に(古いデバイスをサポート、コメントを追加して、クリーンアップを)いくつかのより多くの作品を必要Store.java

で書かれています。しかし、私はこのプロジェクトがあなたを助けると思う。

関連する問題