-
Android 고유식별자 (unique identifiers)Android 2020. 1. 2. 23:19반응형
안드로이드에서 하드웨어의 고유한 구분값이 필요한 경우가 있습니다.
하지만 무분별하게 고유값을 가져올경우 개인의 위치 식별이나 해킹 개인정보등에 노출이 있을수 있기 때문에
한정된 방법으로 고유식별자를 가져오도록 권장하고 있습니다.
https://developer.android.com/training/articles/user-data-ids
1: 하드웨어 식별자 사용을 피합니다. 대부분의 사용 사례에서는 필수 기능을 제한하지 않고 SSAID(Android ID) 및 IMEI와 같은 하드웨어 식별자를 사용하지 않을 수 있습니다.
2: 사용자 프로필이나 광고 사용 사례에는 광고 ID만 사용합니다. 광고 ID를 사용할 때는 항상 광고 추적과 관련하여 사용자의 선택을 존중합니다. 또한 식별자를 PII(개인 식별 정보)에 연결해서는 안 되며 광고 ID 재설정 연결을 피해야 합니다.
3: 결제 사기 예방 및 전화 통신을 제외한 기타 모든 사용 사례에는 가능한 경우 항상 인스턴스 ID 또는 비공개로 저장된 GUID를 사용합니다. 대부분 광고 이외의 사용 사례에는 인스턴스 ID나 GUID만으로 충분합니다.
4: 사용 사례에 적합한 API를 사용하여 개인정보 보호의 위험을 최소화합니다. 가치가 높은 콘텐츠 보호에는 DRM API를, 악용 방지에는 SafetyNet API를 사용하세요. SafetyNet API는 개인정보 보호의 위험을 초래하지 않고 기기의 진위 여부를 확인할 수 있는 가장 쉬운 방법입니다.
위의 내용을 안드로이드 쪽에서 권고 하고 있습니다.
안드로이드 6.0 부터는 Wifi 나 Bluetooth의 Mac Address을 가져오지 못하도록 조치하였습니다.
안드로이드 10 에서는 TelephonyManager에서 개인을 특정할 수 있는 정보를 가져올수 없도록 변경되었습니다.
TelephonyManager().getDeviceId()
TelephonyManager().getImei()
TelephonyManager().getMeid()
그리고 하드웨어의 시리얼넘버도 사용이 불가능해졌습니다.
Builde.SERIAL
안드로이드 10에서 해당 정보들을 호출해서 가져오려고 하면 아래와 같은 java.lang.SecurityException 이 출력 됩니다.
java.lang.RuntimeException: Unable to start activity ComponentInfo{dev.dnights.androiduniqueid/dev.dnights.androiduniqueid.MainActivity}: java.lang.SecurityException: getIccSerialNumber: The user 10404 does not meet the requirements to access device identifiers.
android10 에서 디바이스별 사용자의 고유한 식별자가 필요할경우에 AndroidID 와 WidevineId 를 대체로 사용할 수 있습니다.
[Android ID 공식 설명]
https://developer.android.com/reference/android/provider/Settings.Secure.html?hl=ko#ANDROID_IDAndroidID 는 아래와 같이 방법으로 얻을수 있습니다.
Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID)
[Widevine ID 와 MediaDrm 의 설명]
https://developer.android.com/reference/android/media/MediaDrm.html?hl=ko#MediaDrm(java.util.UUID)WidevineID 는 아래와 같이 방법으로 얻을 수 있습니다.
fun getWidevineID(): String { val WIDEVINE_UUID = UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L) val wvDrm = try { MediaDrm(WIDEVINE_UUID) } catch (e: UnsupportedSchemeException) { //WIDEVINE is not available null } val widevineId = wvDrm!!.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID) val encodedWidevineId = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { Base64.getEncoder().encodeToString(widevineId).trim() } else { TODO("VERSION.SDK_INT < O") } return encodedWidevineId }
안드로이드 고유ID Sample Code 입니다.
https://github.com/DNights/AndroidUniqueID
[참고링크]
https://brunch.co.kr/@huewu/9
https://brunch.co.kr/@huewu/15반응형'Android' 카테고리의 다른 글
Build a Modular Android App Architecture (Google I/O'19) (0) 2020.02.07 Android .gitignore 내용 (0) 2020.01.27 Android KeyStore 정보를 환경 변수로 저장/사용 (for.Mac) (0) 2020.01.23 Android Learning Links (안드로이드 학습 링크) (0) 2020.01.07 Android Studio Editor 폰트(글꼴) 변경 (0) 2019.12.17 Storage Access Framwork 다루기 (Android ScopedStorage) (1) 2019.12.13 MediaStore File 다루기 (Android ScopedStorage) (6) 2019.12.11 Android R8 Compiler (0) 2019.12.05