naver / naveridlogin-sdk-android

네이버 아이디로 로그인 SDK (안드로이드)
https://developers.naver.com/docs/login/overview/
Apache License 2.0
114 stars 29 forks source link

[Bug Report] java.security.KeyStoreException #86

Closed OnedayLee closed 1 year ago

OnedayLee commented 1 year ago

Bug Report

재현 환경

사용중인 네아로 SDK 버전

5.5.0

Android 버전

7 ~ 12 까지 전부 발생합니다.

재현되는 기기 모델명

Galaxy A32, Galaxy Note8, Galaxy A31, LG Q9...등등 딱히 모델을 가리진 않는 것 같습니다.

이슈

이슈 명세

앱 실행하면서 초기화하면서 죽는 것 같습니다.

기대한 결과

앱 정상실행 및 초기화

실제 결과

재현 시나리오

개발자 테스트기기들에서는 재현이 되지 않음

Stack trace

java.security.KeyStoreException: the master key android-keystore://_androidx_security_master_key_ exists but is unusable
       at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6250)
       at android.app.ActivityThread.access$1200(ActivityThread.java:238)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1787)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:7073)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

Caused by java.security.KeyStoreException: the master key android-keystore://_androidx_security_master_key_ exists but is unusable
       at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.readOrGenerateNewMasterKey(AndroidKeysetManager.java:275)
       at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.build(AndroidKeysetManager.java:236)
       at androidx.security.crypto.EncryptedSharedPreferences.create(EncryptedSharedPreferences.java:155)
       at androidx.security.crypto.EncryptedSharedPreferences.create(EncryptedSharedPreferences.java:120)
       at com.navercorp.nid.preference.EncryptedPreferences.createSharedPreferences(EncryptedPreferences.kt:55)
       at com.navercorp.nid.preference.EncryptedPreferences.init(EncryptedPreferences.kt:40)
       at com.navercorp.nid.preference.EncryptedPreferences.access$init(EncryptedPreferences.kt:18)
       at com.navercorp.nid.preference.EncryptedPreferences$encryptedPreferences$2.invoke(EncryptedPreferences.kt:31)
       at com.navercorp.nid.preference.EncryptedPreferences$encryptedPreferences$2.invoke(EncryptedPreferences.kt:30)
       at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
       at com.navercorp.nid.preference.EncryptedPreferences.getEncryptedPreferences(EncryptedPreferences.kt:30)
       at com.navercorp.nid.preference.EncryptedPreferences.get(EncryptedPreferences.kt:107)
       at com.navercorp.nid.oauth.NidOAuthPreferencesManager.getClientId(NidOAuthPreferencesManager.kt:54)
       at com.navercorp.nid.preference.EncryptedPreferences.migration(EncryptedPreferences.kt:133)
       at com.navercorp.nid.preference.EncryptedPreferences.setContext(EncryptedPreferences.kt:67)
       at com.navercorp.nid.NaverIdLoginSDK.initialize(NaverIdLoginSDK.kt:64)
       at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1154)
       at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6245)
       at android.app.ActivityThread.access$1200(ActivityThread.java:238)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1787)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:7073)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

Caused by java.security.InvalidKeyException: Keystore operation failed
       at android.security.KeyStore.getInvalidKeyException(KeyStore.java:1306)
       at android.security.KeyStore.getInvalidKeyException(KeyStore.java:1331)
       at android.security.keystore.KeyStoreCryptoOperationUtils.getInvalidKeyExceptionForInit(KeyStoreCryptoOperationUtils.java:54)
       at android.security.keystore.KeyStoreCryptoOperationUtils.getExceptionForCipherInit(KeyStoreCryptoOperationUtils.java:89)
       at android.security.keystore.AndroidKeyStoreCipherSpiBase.ensureKeystoreOperationInitialized(AndroidKeyStoreCipherSpiBase.java:265)
       at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:109)
       at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:2984)
       at javax.crypto.Cipher.tryCombinations(Cipher.java:2891)
       at javax.crypto.Cipher$SpiAndProviderUpdater.updateAndGetSpiAndProvider(Cipher.java:2796)
       at javax.crypto.Cipher.chooseProvider(Cipher.java:773)
       at javax.crypto.Cipher.init(Cipher.java:1143)
       at javax.crypto.Cipher.init(Cipher.java:1084)
       at com.google.crypto.tink.integration.android.AndroidKeystoreAesGcm.encryptInternal(AndroidKeystoreAesGcm.java:84)
       at com.google.crypto.tink.integration.android.AndroidKeystoreAesGcm.encrypt(AndroidKeystoreAesGcm.java:72)
       at com.google.crypto.tink.integration.android.AndroidKeystoreKmsClient.validateAead(AndroidKeystoreKmsClient.java:248)
       at com.google.crypto.tink.integration.android.AndroidKeystoreKmsClient.getAead(AndroidKeystoreKmsClient.java:165)
       at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.readOrGenerateNewMasterKey(AndroidKeysetManager.java:267)
       at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.build(AndroidKeysetManager.java:236)
       at androidx.security.crypto.EncryptedSharedPreferences.create(EncryptedSharedPreferences.java:155)
       at androidx.security.crypto.EncryptedSharedPreferences.create(EncryptedSharedPreferences.java:120)
       at com.navercorp.nid.preference.EncryptedPreferences.createSharedPreferences(EncryptedPreferences.kt:55)
       at com.navercorp.nid.preference.EncryptedPreferences.init(EncryptedPreferences.kt:40)
       at com.navercorp.nid.preference.EncryptedPreferences.access$init(EncryptedPreferences.kt:18)
       at com.navercorp.nid.preference.EncryptedPreferences$encryptedPreferences$2.invoke(EncryptedPreferences.kt:31)
       at com.navercorp.nid.preference.EncryptedPreferences$encryptedPreferences$2.invoke(EncryptedPreferences.kt:30)
       at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
       at com.navercorp.nid.preference.EncryptedPreferences.getEncryptedPreferences(EncryptedPreferences.kt:30)
       at com.navercorp.nid.preference.EncryptedPreferences.get(EncryptedPreferences.kt:107)
       at com.navercorp.nid.oauth.NidOAuthPreferencesManager.getClientId(NidOAuthPreferencesManager.kt:54)
       at com.navercorp.nid.preference.EncryptedPreferences.migration(EncryptedPreferences.kt:133)
       at com.navercorp.nid.preference.EncryptedPreferences.setContext(EncryptedPreferences.kt:67)
       at com.navercorp.nid.NaverIdLoginSDK.initialize(NaverIdLoginSDK.kt:64)
       at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1154)
       at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6245)
       at android.app.ActivityThread.access$1200(ActivityThread.java:238)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1787)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:7073)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

Caused by android.security.KeyStoreException: Too many operations
       at android.security.KeyStore.getKeyStoreException(KeyStore.java:1188)
       at android.security.KeyStore.getInvalidKeyException(KeyStore.java:1331)
       at android.security.keystore.KeyStoreCryptoOperationUtils.getInvalidKeyExceptionForInit(KeyStoreCryptoOperationUtils.java:54)
       at android.security.keystore.KeyStoreCryptoOperationUtils.getExceptionForCipherInit(KeyStoreCryptoOperationUtils.java:89)
       at android.security.keystore.AndroidKeyStoreCipherSpiBase.ensureKeystoreOperationInitialized(AndroidKeyStoreCipherSpiBase.java:265)
       at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:109)
       at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:2984)
       at javax.crypto.Cipher.tryCombinations(Cipher.java:2891)
       at javax.crypto.Cipher$SpiAndProviderUpdater.updateAndGetSpiAndProvider(Cipher.java:2796)
       at javax.crypto.Cipher.chooseProvider(Cipher.java:773)
       at javax.crypto.Cipher.init(Cipher.java:1143)
       at javax.crypto.Cipher.init(Cipher.java:1084)
       at com.google.crypto.tink.integration.android.AndroidKeystoreAesGcm.encryptInternal(AndroidKeystoreAesGcm.java:84)
       at com.google.crypto.tink.integration.android.AndroidKeystoreAesGcm.encrypt(AndroidKeystoreAesGcm.java:72)
       at com.google.crypto.tink.integration.android.AndroidKeystoreKmsClient.validateAead(AndroidKeystoreKmsClient.java:248)
       at com.google.crypto.tink.integration.android.AndroidKeystoreKmsClient.getAead(AndroidKeystoreKmsClient.java:165)
       at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.readOrGenerateNewMasterKey(AndroidKeysetManager.java:267)
       at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.build(AndroidKeysetManager.java:236)
       at androidx.security.crypto.EncryptedSharedPreferences.create(EncryptedSharedPreferences.java:155)
       at androidx.security.crypto.EncryptedSharedPreferences.create(EncryptedSharedPreferences.java:120)
       at com.navercorp.nid.preference.EncryptedPreferences.createSharedPreferences(EncryptedPreferences.kt:55)
       at com.navercorp.nid.preference.EncryptedPreferences.init(EncryptedPreferences.kt:40)
       at com.navercorp.nid.preference.EncryptedPreferences.access$init(EncryptedPreferences.kt:18)
       at com.navercorp.nid.preference.EncryptedPreferences$encryptedPreferences$2.invoke(EncryptedPreferences.kt:31)
       at com.navercorp.nid.preference.EncryptedPreferences$encryptedPreferences$2.invoke(EncryptedPreferences.kt:30)
       at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
       at com.navercorp.nid.preference.EncryptedPreferences.getEncryptedPreferences(EncryptedPreferences.kt:30)
       at com.navercorp.nid.preference.EncryptedPreferences.get(EncryptedPreferences.kt:107)
       at com.navercorp.nid.oauth.NidOAuthPreferencesManager.getClientId(NidOAuthPreferencesManager.kt:54)
       at com.navercorp.nid.preference.EncryptedPreferences.migration(EncryptedPreferences.kt:133)
       at com.navercorp.nid.preference.EncryptedPreferences.setContext(EncryptedPreferences.kt:67)
       at com.navercorp.nid.NaverIdLoginSDK.initialize(NaverIdLoginSDK.kt:64)
       at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1154)
       at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6245)
       at android.app.ActivityThread.access$1200(ActivityThread.java:238)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1787)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:7073)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

Reference

DayeonLee-0 commented 1 year ago

안녕하세요.

네아로 SDK 담당자입니다.

네아로 SDK v5.6.0에서 KeyStoreException에 대한 예외 처리가 추가되었습니다.

개발에 참고 부탁드립니다.

감사합니다.