0
Realm을 로컬 데이터베이스로 사용 중이며 암호화해야합니다. 나는 안드로이드 키 스토어를 사용하여 SecretKey를 저장하려고 시도하고 있는데, 키 스토어에 저장하는 것처럼 보이지만, SecretKey.getEncoded()를 사용할 때 항상 null을 반환한다. 코드는 다음과 같습니다.Android 키 저장소에서 SecretKey를 가져오고 영역 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 만 반환합니다.