안드로이드 리눅스 커널 상에 구축 리눅스의 보안 기능 이용
설치된 앱마다 UID GID를 부여(리눅스 상의 기능) 데이터 각각 사용
...
앱 B에서 앱 A를 사용하기 위해 퍼미션을 사용
퍼미션 스틸링 대응
2. getCallingActivity().getPackageName() 호출원의 패키지명 확인 해시 검출
AES 암호화
네트워크에서 native라이브러리 로드X 앱내에서만O 자바 동적코드로딩X
자바스크립트 인터페이스 사용은 개발사, 협력사 도메인만
@JavascriptInterface 어노테이션을 붙여야 함(17이상 호출가능 4.2 없으면 에러)
https SSLHandshakeException 인증서 검증 오류 우회하지 말고 제대로 처리할 것
webview file:// 스킴 취약성 http 와 https만 허용하도록
시스템 취약성 해소는 SecureRandom
SecureRandom의 취약성은 아래 사이트에서 대처
https://android-developers.googleblog.com/2013/08/some-securerandom-thoughts.html
보안 팁 페이지 https://developer.android.com/training/articles/security-tips
설치된 앱마다 UID GID를 부여(리눅스 상의 기능) 데이터 각각 사용
$adb shell $cd /data/data/ $ls -al | grep com.advanced (uid,gid 확인)
UID, GID가 같으면 저장소 공유 가능 sharedUserId 서명이 같아야 함
매니페스트 android:sharedUserId="com.advanced_android.uid"도 같아야 함
sharedUserId 릴리즈 된 앱에서 추가되면 업데이트 불가 삭제후 재설치
그럴 경우는 contentprovider를 사용
adb shell ps 프로세스 확인 앱이 독립되어 있는지 보기 위해
퍼미션
ContextCompat.checkSelfPermission() 퍼미션 허용여부 검사
ActivityCompat.requestPermissions() 퍼미션 요청
ActivityCompat.shouldShowRequestPermissionRationale() 트루면 설명이 필요
앱 내에 퍼미션 사용 (같은 서명 사용 필요)
앱 A의 액티비티를 퍼미션으로 보호
앱 B에서 앱 A를 사용하기 위해 퍼미션을 사용
퍼미션 스틸링 대응
$keytool -list -v -keystore ~/.android/debug.keystore -storepass android 해시값1. 출력된 Hash(sha1)에서 콜론(:)을 제거한 값을 검사
2. getCallingActivity().getPackageName() 호출원의 패키지명 확인 해시 검출
public static String hash(Context ctx, String pkgName){ if(pkgname==null)return null; try{ PackageManager pm = ctx.getPackageManager(); PackageInfo pkginfo = pm.getPackageInfo(pkgname, PackageManager.GET_SIGNATURES); if(pkginfo.signatures.length != 1) return null; Signature sig = pkginfo.signatures[0]; byte[] cert = sig.toByteArray(); byte[] sha1 = computeSha1(cert); return byte2hex(sha1); }catch (NameNotFoundException e){} return null;}1과 2의 해시값이 같을때만 허용
AES 암호화
public static byte[] cipherEncrypt(byte[] buf, String key, String iv){ try{ SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), "AES");비밀키 IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());초기화 벡터 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); cipher.init(Cipher.ENCRYPT_MODE, sksSpec, ivSpec); return cipher.doFinal(buf); } catch(Exception e){} finally{} return null; }sharedPreference 난독화 키를 난독화하고 상수로 사용
네트워크에서 native라이브러리 로드X 앱내에서만O 자바 동적코드로딩X
자바스크립트 인터페이스 사용은 개발사, 협력사 도메인만
@JavascriptInterface 어노테이션을 붙여야 함(17이상 호출가능 4.2 없으면 에러)
https SSLHandshakeException 인증서 검증 오류 우회하지 말고 제대로 처리할 것
webview file:// 스킴 취약성 http 와 https만 허용하도록
시스템 취약성 해소는 SecureRandom
SecureRandom의 취약성은 아래 사이트에서 대처
https://android-developers.googleblog.com/2013/08/some-securerandom-thoughts.html
보안 팁 페이지 https://developer.android.com/training/articles/security-tips
'개발정보 > 안드로이드' 카테고리의 다른 글
안드로이드 개발 레벨업 교과서 15장 인앱결제(IAB) (0) | 2019.01.18 |
---|---|
안드로이드 개발 레벨업 교과서 14장 최적화 (0) | 2019.01.17 |
안드로이드 개발 레벨업 교과서 12장 머티리얼 디자인 구현 (0) | 2019.01.17 |
안드로이드 개발 레벨업 교과서 11장 머티리얼 디자인 가이드라인 (0) | 2019.01.16 |
안드로이드 개발 레벨업 교과서 10장 디자인 기초 (0) | 2019.01.16 |