2018. 7. 29. 11:54ㆍSecurity ★ Development/안드로이드 모바일 보안
Android framework 쪽 기능을 구현하다보면 어떤 기능이 특정 app만 사용할 수 있게끔 해야하는 경우가 있습니다.
이런경우 안드로이드(AOSP)에서 제공해주는 권한을 이용 할 수도 있지만 특정 개발자(서명보유자)의 app만 사용하도록 할 수도 있습니다.
모든 안드로이드 app은 배포되기위해 signing이 되어야합니다. 이때 signing되는 key는 vendor나 개인 개발자가 각자 보유하게되죠.
여러 app을 같은 key로 signing할 경우 이 app들에 대해서만 허용해주는 로직을 만들 수 있습니다.
PackageInfo packageInfo=context.getPackageManager().getPackageInfo("패키지명", PackageManager.GET_SIGNATURES);
패키지명으로 비교를 원하는 app의 PackageInfo를 가져옵니다. 특정 app의 위변조를 체크하기 위해 고정된 값을 넣을 수도 있고 로직을 사용하는 app의 pid, pname 혹은 topactivity 정보를 가지고 동적으로 얻을 수도 있습니다.
Signature signature=packageInfo.signatures[0];
Packageinfo에서 signature 값을 가져오는데 signing을 2중, 3중으로 할 경우 for문을 통해 가져오고 전부 비교해주기도합니다.
byte[] signatureBytes=signatrue.toByteArray();
MessageDigest md=MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
String currentSignature=Base64.encodeToString(md.digest(), Base64.DEFAULT);
if(currentSignature.equals("올바른서명값"))
Signature에서 SHA 혹은 SHA256 등을 통해 값을 가져오고 인코딩을 거쳐 원래 비교할 서명값이랑 비교해줍니다.
허용할 서명값의 리스트를 만들어둘 수 도 있고 하드코딩이 불안하다면 mealy machine을 통해 런타임시 복호화하여 사용할 수도 있습니다. 키를 안전하게 보관하는것이 가능하다면 평범한 암호화 결과를 넣어둘 수도 있구요.
안드로이드 app은 업데이트시 항상 같은 키로 서명되었는지를 확인하기 때문에 위 방법을 사용하면 app가 기존의 app이 맞는지 확인 할 수 있습니다.
'Security ★ Development > 안드로이드 모바일 보안' 카테고리의 다른 글
퀄컴 QSEE 개발(ca part) (0) | 2020.04.04 |
---|---|
모바일 보안 패치 확인 (0) | 2018.10.14 |
Trustzone (0) | 2016.09.11 |
OWASP mobile - Cryptographic Key Replacement (0) | 2015.08.31 |
OWASP mobile - Insufficient Session Expiration (0) | 2015.08.28 |