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が返されます。