Google Tink Crypto library - реализация KeyGenerator AES не найдена
Я сталкиваюсь с этой проблемой на планшетном устройстве под управлением Android KitKat, а также на Samsung Tab-A на Lollipop. Он отлично работал на планшете Acer под управлением Android M.
Вот точка отказа:
private KeysetHandle getOrGenerateNewKeysetHandle() throws IOException, GeneralSecurityException {
return new AndroidKeysetManager.Builder()
.withSharedPref(getApplicationContext(), TINK_KEYSET_NAME, TINK_PREF_FILE_NAME)
.withKeyTemplate(AeadKeyTemplates.AES256_GCM) // Failure point
.withMasterKeyUri(ANDROID_KEYSTORE_TINK_MASTER_KEY_URI)
.build()
.getKeysetHandle();
}
И затем я инициализирую свой AEAD при инициализации Tink:
// google\Tink crypto
try {
TinkConfig.register();
aead = AeadFactory.getPrimitive(getOrGenerateNewKeysetHandle());
Log.i(LOG_TAG, "Tink registered.");
} catch (GeneralSecurityException | IOException e) {
e.printStackTrace();
Log.e(LOG_TAG, "Tink failed to register or could not generate a keyset handle.");
Log.e(LOG_TAG, "Tink failed to register: " + e.getMessage());
}
В любом случае, Tink не может выполнить инициализацию с помощью приведенного ниже сообщения:
10-03 16:10:58.319 com.mycompany.myapp.debug E/MainActivity: Tink failed to register: KeyGenerator AES implementation not found
Есть ли конкретный шаблон KeyTemplate, которым я могу заменить ниже?
AeadKeyTemplates.AES256_GCM
Полная Stacktrace:
10-03 17:25:45.235 com.mycompany.myapp.debug W/System.err: java.security.NoSuchAlgorithmException: KeyGenerator AES implementation not found
10-03 17:25:45.245 com.mycompany.myapp.debug W/System.err: at org.apache.harmony.security.fortress.Engine.notFound(Engine.java:177)
10-03 17:25:45.255 com.mycompany.myapp.debug W/System.err: at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:170)
10-03 17:25:45.255 com.mycompany.myapp.debug W/System.err: at javax.crypto.KeyGenerator.getInstance(KeyGenerator.java:163)
10-03 17:25:45.255 com.mycompany.myapp.debug W/System.err: at javax.crypto.KeyGenerator.getInstance(KeyGenerator.java:135)
10-03 17:25:45.255 com.mycompany.myapp.debug W/System.err: at com.google.crypto.tink.integration.android.AndroidKeystoreKmsClient.generateNewAeadKey(AndroidKeystoreKmsClient.java:141)
10-03 17:25:45.265 com.mycompany.myapp.debug W/System.err: at com.google.crypto.tink.integration.android.AndroidKeystoreKmsClient.getOrGenerateNewAeadKey(AndroidKeystoreKmsClient.java:128)
10-03 17:25:45.265 com.mycompany.myapp.debug W/System.err: at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.withMasterKeyUri(AndroidKeysetManager.java:157)
10-03 17:25:45.265 com.mycompany.myapp.debug W/System.err: at com.mycompany.myapp.MainActivity.getOrGenerateNewKeysetHandle(MainActivity.java:2520)
10-03 17:25:45.265 com.mycompany.myapp.debug W/System.err: at com.mycompany.myapp.MainActivity.initializeRequiredAppComponents(MainActivity.java:2554)
10-03 17:25:45.265 com.mycompany.myapp.debug W/System.err: at com.mycompany.myapp.MainActivity.onCreate(MainActivity.java:230)
10-03 17:25:45.275 com.mycompany.myapp.debug W/System.err: at android.app.Activity.performCreate(Activity.java:5231)
10-03 17:25:45.275 com.mycompany.myapp.debug W/System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-03 17:25:45.275 com.mycompany.myapp.debug W/System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
10-03 17:25:45.275 com.mycompany.myapp.debug W/System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
10-03 17:25:45.275 com.mycompany.myapp.debug W/System.err: at android.app.ActivityThread.access$800(ActivityThread.java:135)
10-03 17:25:45.285 com.mycompany.myapp.debug W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
10-03 17:25:45.285 com.mycompany.myapp.debug W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
10-03 17:25:45.285 com.mycompany.myapp.debug W/System.err: at android.os.Looper.loop(Looper.java:136)
10-03 17:25:45.285 com.mycompany.myapp.debug W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5017)
10-03 17:25:45.285 com.mycompany.myapp.debug W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
10-03 17:25:45.295 com.mycompany.myapp.debug W/System.err: at java.lang.reflect.Method.invoke(Method.java:515)
10-03 17:25:45.295 com.mycompany.myapp.debug W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
10-03 17:25:45.295 com.mycompany.myapp.debug W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
10-03 17:25:45.295 com.mycompany.myapp.debug W/System.err: at dalvik.system.NativeStart.main(Native Method)
10-03 17:25:45.295 com.mycompany.myapp.debug E/MainActivity: GeneralSecurityException - Tink failed to register or could not generate a keyset handle: KeyGenerator AES implementation not found
10-03 17:25:45.295 com.mycompany.myapp.debug E/MainActivity: isMDMAPISupported: Exception ignored
1 ответ
Ниже приведены временные решения при решении проблемы на Tink v1.2.0. Для Android SDK ниже 23 мы пропускаем использование Keystore при создании keysetManager.
Однако это больше не должно быть проблемой для Tink v1.2.1 (когда она будет выпущена), так как я протестировал последнюю версию HEAD-SNAPSHOT и не столкнулся с сбоем.
private KeysetHandle getOrGenerateNewKeysetHandle() throws IOException, GeneralSecurityException {
AndroidKeysetManager.Builder keysetManagerBuilder = new AndroidKeysetManager.Builder()
.withSharedPref(getApplicationContext(), TINK_KEYSET_NAME, TINK_PREF_FILE_NAME)
.withKeyTemplate(AeadKeyTemplates.AES256_GCM);
if (Build.VERSION.SDK_INT >= 23) {
keysetManagerBuilder.withMasterKeyUri(ANDROID_KEYSTORE_TINK_MASTER_KEY_URI);
} else {
keysetManagerBuilder.doNotUseKeystore();
}
return keysetManagerBuilder.build().getKeysetHandle();
}