2016-08-08 12 views
0

Realmをローカルデータベースとして使用しており、暗号化する必要があります。 Androidキーストアを使用してSecretKeyを格納しようとしていますが、KeyStoreに格納しているようですが、SecretKey.getEncoded()を使用すると、常にnullが返されます。コードは次のとおりです。AndroidキーストアからSecretKeyを取得し、Realm IOで使用する

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); 
     keyStore.load(null); 
     Enumeration<String> aliases = keyStore.aliases(); 

     while(aliases.hasMoreElements()) { 
      Log.v("KEY ALIAS",aliases.nextElement()); 
     } 


     SecretKey keyStoreKey = (SecretKey) keyStore.getKey(ALIAS, null); 

     if(keyStoreKey == null) { 
      Log.v("NO KEY","USING NEW KEY"); 
      KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(ALIAS, 
        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT); 
      KeyGenParameterSpec keySpec = builder 
        .setKeySize(512) 
        .setRandomizedEncryptionRequired(true) 
        .setUserAuthenticationRequired(true) 
        .setUserAuthenticationValidityDurationSeconds(5 * 60) 
        .build(); 

      KeyGenerator kg = KeyGenerator.getInstance("HmacSHA1", "AndroidKeyStore"); 
      kg.init(keySpec); 
      keyStoreKey = kg.generateKey(); 

      keyStore.setEntry(ALIAS, 
        new KeyStore.SecretKeyEntry(keyStoreKey), 
        new KeyProtection.Builder(KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) 
          .setBlockModes(KeyProperties.BLOCK_MODE_GCM) 
          .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) 
          .build()); 
     } else { 
      Log.v("GOT KEY","USING OLD KEY"); 
     } 

     //THIS IS THE LINE THAT RETURNS NULL WHEN USING A KEY FROM KEYSTORE 
     byte[] key = keyStoreKey.getEncoded(); 

次に、レルムに「キー」というバイト配列を使用します。コードは最初の起動時(キーの作成時)に正常に動作しますが、キーストア内でコードを検出した場合は、キーのバイトを取得するとnullが返されます。

答えて

1

これは意図的です。 Android KeyStoreでは、保存された鍵素材は公開されません。鍵ストアでは、代わりにKeyStoreにアクションを実行するよう依頼することができます。

解決策の1つは二重鍵です。

  1. レルムをロック解除するために使用するキー(keyA)を生成します。
  2. 2番目のランダムキー(keyB)を生成します。
  3. KeyStoreにkeyBを保存します。
  4. keyBを使用してkeyAを暗号化します。これはランダムな文字列になりました。どこでも保存できます。
  5. 暗号化されたバージョンのkeyAをSharedPreferencesに保存します。
  6. レルムを開くときに、(KeyBを使用して)KeyStoreのSharedPreferencesから暗号化されたキーAを復号化し、それをRealmに渡します。

私たちはhere(まだ進行中です)を示すサンプルプロジェクトに取り組んでいます。

関連する問題