naver / naveridlogin-sdk-android

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

[Bug Report] KeyStoreException #96

Closed Kim-DongGeun closed 1 year ago

Kim-DongGeun commented 1 year ago

Bug Report

재현 환경

여러 환경에서 간헐적으로 발생

사용중인 네아로 SDK 버전

5.6.0

Android 버전

9 10 12 13 에서 발생하며 특정 버전에서만 발생하는건 아닌것 같습니다

재현되는 기기 모델명

모토롤라, 갤럭시 등 다양한 디바이스

이슈

이슈 명세

initialize 호출 시 KeyStoreException 발생

기대한 결과

정상적인 init

실제 결과

exception 발생

재현 시나리오

특정 시나리오는 없고 간헐적으로 발생

Stack trace

# Date: Mon Jul 31 2023 22:20:38 GMT+0900 (한국 표준시)

Fatal Exception: java.lang.RuntimeException: Unable to create application ...: java.security.GeneralSecurityException: Keystore key generation failed
       at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6962)
       at android.app.ActivityThread.-$$Nest$mhandleBindApplication()
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2219)
       at android.os.Handler.dispatchMessage(Handler.java:111)
       at android.os.Looper.loopOnce(Looper.java:238)
       at android.os.Looper.loop(Looper.java:357)
       at android.app.ActivityThread.main(ActivityThread.java:8118)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:957)

Caused by java.security.GeneralSecurityException: Keystore key generation failed
       at androidx.security.crypto.MasterKeys.generateKey(MasterKeys.java:149)
       at androidx.security.crypto.MasterKeys.getOrCreate(MasterKeys.java:100)
       at androidx.security.crypto.MasterKey$Builder$Api23Impl.build(MasterKey.java:380)
       at androidx.security.crypto.MasterKey$Builder.build(MasterKey.java:320)
       at com.navercorp.nid.preference.EncryptedPreferences$masterKey$2.invoke(EncryptedPreferences.kt:27)
       at com.navercorp.nid.preference.EncryptedPreferences$masterKey$2.invoke(EncryptedPreferences.kt)
       at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
       at com.navercorp.nid.preference.EncryptedPreferences.<clinit>(EncryptedPreferences.kt:23)
       at com.navercorp.nid.preference.EncryptedPreferences.getMasterKey(EncryptedPreferences.kt:23)
       at com.navercorp.nid.preference.EncryptedPreferences.createSharedPreferences(EncryptedPreferences.kt:60)
       at com.navercorp.nid.preference.EncryptedPreferences.init(EncryptedPreferences.kt:47)
       at com.navercorp.nid.preference.EncryptedPreferences.access$init(EncryptedPreferences.kt)
       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.<clinit>(EncryptedPreferences.kt:30)
       at com.navercorp.nid.preference.EncryptedPreferences.getEncryptedPreferences(EncryptedPreferences.kt:30)
       at com.navercorp.nid.preference.EncryptedPreferences.get$default(EncryptedPreferences.kt:109)
       at com.navercorp.nid.preference.EncryptedPreferences.get(EncryptedPreferences.kt:109)
       at com.navercorp.nid.oauth.NidOAuthPreferencesManager.getClientId(NidOAuthPreferencesManager.kt:54)
       at com.navercorp.nid.preference.EncryptedPreferences.migration(EncryptedPreferences.kt:135)
       at com.navercorp.nid.preference.EncryptedPreferences.setContext(EncryptedPreferences.kt:69)
       at com.navercorp.nid.NaverIdLoginSDK.initialize(NaverIdLoginSDK.kt:64)
       ...

Caused by java.security.ProviderException: Keystore key generation failed
       at android.security.keystore2.AndroidKeyStoreKeyGeneratorSpi.engineGenerateKey(AndroidKeyStoreKeyGeneratorSpi.java:413)
       at javax.crypto.KeyGenerator.generateKey(KeyGenerator.java:612)
       at androidx.security.crypto.MasterKeys.generateKey(MasterKeys.java:145)
       at androidx.security.crypto.MasterKeys.getOrCreate(MasterKeys.java:100)
       at androidx.security.crypto.MasterKey$Builder$Api23Impl.build(MasterKey.java:380)
       at androidx.security.crypto.MasterKey$Builder.build(MasterKey.java:320)
       at com.navercorp.nid.preference.EncryptedPreferences$masterKey$2.invoke(EncryptedPreferences.kt:27)
       at com.navercorp.nid.preference.EncryptedPreferences$masterKey$2.invoke(EncryptedPreferences.kt)
       at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
       at com.navercorp.nid.preference.EncryptedPreferences.<clinit>(EncryptedPreferences.kt:23)
       at com.navercorp.nid.preference.EncryptedPreferences.getMasterKey(EncryptedPreferences.kt:23)
       at com.navercorp.nid.preference.EncryptedPreferences.createSharedPreferences(EncryptedPreferences.kt:60)
       at com.navercorp.nid.preference.EncryptedPreferences.init(EncryptedPreferences.kt:47)
       at com.navercorp.nid.preference.EncryptedPreferences.access$init(EncryptedPreferences.kt)
       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.<clinit>(EncryptedPreferences.kt:30)
       at com.navercorp.nid.preference.EncryptedPreferences.getEncryptedPreferences(EncryptedPreferences.kt:30)
       at com.navercorp.nid.preference.EncryptedPreferences.get$default(EncryptedPreferences.kt:109)
       at com.navercorp.nid.preference.EncryptedPreferences.get(EncryptedPreferences.kt:109)
       at com.navercorp.nid.oauth.NidOAuthPreferencesManager.getClientId(NidOAuthPreferencesManager.kt:54)
       at com.navercorp.nid.preference.EncryptedPreferences.migration(EncryptedPreferences.kt:135)
       at com.navercorp.nid.preference.EncryptedPreferences.setContext(EncryptedPreferences.kt:69)
       at com.navercorp.nid.NaverIdLoginSDK.initialize(NaverIdLoginSDK.kt:64)
       ...

Caused by android.security.KeyStoreException: -49 (internal Keystore code: -49 message: In generate_key.

Caused by:
    0: While generating Key without explicit attestation key.
    1: Error::Km(ErrorCode(-49)))
       at android.security.KeyStore2.getKeyStoreException(KeyStore2.java:369)
       at android.security.KeyStoreSecurityLevel.handleExceptions(KeyStoreSecurityLevel.java:57)
       at android.security.KeyStoreSecurityLevel.generateKey(KeyStoreSecurityLevel.java:145)
       at android.security.keystore2.AndroidKeyStoreKeyGeneratorSpi.engineGenerateKey(AndroidKeyStoreKeyGeneratorSpi.java:400)
       at javax.crypto.KeyGenerator.generateKey(KeyGenerator.java:612)
       at androidx.security.crypto.MasterKeys.generateKey(MasterKeys.java:145)
       at androidx.security.crypto.MasterKeys.getOrCreate(MasterKeys.java:100)
       at androidx.security.crypto.MasterKey$Builder$Api23Impl.build(MasterKey.java:380)
       at androidx.security.crypto.MasterKey$Builder.build(MasterKey.java:320)
       at com.navercorp.nid.preference.EncryptedPreferences$masterKey$2.invoke(EncryptedPreferences.kt:27)
       at com.navercorp.nid.preference.EncryptedPreferences$masterKey$2.invoke(EncryptedPreferences.kt)
       at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
       at com.navercorp.nid.preference.EncryptedPreferences.<clinit>(EncryptedPreferences.kt:23)
       at com.navercorp.nid.preference.EncryptedPreferences.getMasterKey(EncryptedPreferences.kt:23)
       at com.navercorp.nid.preference.EncryptedPreferences.createSharedPreferences(EncryptedPreferences.kt:60)
       at com.navercorp.nid.preference.EncryptedPreferences.init(EncryptedPreferences.kt:47)
       at com.navercorp.nid.preference.EncryptedPreferences.access$init(EncryptedPreferences.kt)
       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.<clinit>(EncryptedPreferences.kt:30)
       at com.navercorp.nid.preference.EncryptedPreferences.getEncryptedPreferences(EncryptedPreferences.kt:30)
       at com.navercorp.nid.preference.EncryptedPreferences.get$default(EncryptedPreferences.kt:109)
       at com.navercorp.nid.preference.EncryptedPreferences.get(EncryptedPreferences.kt:109)
       at com.navercorp.nid.oauth.NidOAuthPreferencesManager.getClientId(NidOAuthPreferencesManager.kt:54)
       at com.navercorp.nid.preference.EncryptedPreferences.migration(EncryptedPreferences.kt:135)
       at com.navercorp.nid.preference.EncryptedPreferences.setContext(EncryptedPreferences.kt:69)
       at com.navercorp.nid.NaverIdLoginSDK.initialize(NaverIdLoginSDK.kt:64)
       ...

Reference

Kim-DongGeun commented 1 year ago

추가로 NaverIdLoginSDK.getState() 로 NEED_INIT 체크 시 NaverIdLoginSDK.initialize() 이 호출되지 않아 init 되지 않았으면 context를 넘겨받지 못해 getState() 호출 시 에러가 발생하는거 같습니다

Kim-DongGeun commented 1 year ago

5.7.0 버전에서도 발생하는 이슈로 확인됩니다 @DayeonLee-0 확인 부탁드립니다

DayeonLee-0 commented 1 year ago

안녕하세요.

네아로 SDK 담당자입니다.

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

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

감사합니다.