프로그램 무결성 검증이란?
안드로이드에서 프로그램 무결성 검증이란 앱 위ㆍ변조 여부를 확인하는 항목
Signing Key 검증 소스코드 (API 28 버전)
API 28 버전 이상부터는 서명을 하여도 재 서명이 가능하여, 앱 해쉬 값 검증, Signing Key 검증 등을 통해 무결성 검증을 진행할 필요가 있음
public class MainActivity extends AppCompatActivity {
// 검증할 앱의 서명 값 (SHA-256 값)
private static final String APP_SIGNATURE = "[Hash 값]";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 추출된 서명 값과 앱 서명 값 검증
boolean isValidSignature = verifyAppSignature(APP_SIGNATURE);
if (isValidSignature) {
// 검증 성공 로직
Toast.makeText(this, "App signature is valid", Toast.LENGTH_SHORT).show();
} else {
// 검증 실패 로직
Toast.makeText(this, "App signature is NOT valid", Toast.LENGTH_SHORT).show();
finish(); // 앱 종료
}
}
private boolean verifyAppSignature(String expectedSignature) {
try {
// 패키지 정보 가져오기
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(),PackageManager.GET_SIGNING_CERTIFICATES);
// 앱 서명 값(Signature) 가져오기
Signature[] signatures = packageInfo.signingInfo.getApkContentsSigners();
for (Signature signature : signatures) {
// 앱 서명 값 암호화 (SHA-256 사용)
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(signature.toByteArray());
byte[] signatureBytes = md.digest();
// 앱 서명 값 검증
String currentSignature = bytesToHex(signatureBytes);
if (currentSignature.equals(expectedSignature)) {
// 서명 값 일치하는 경우 true 반환
return true;
}
}
} catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 서명 값 일치하지 않는 경우 false 반환
return false;
}
private String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X", b));
}
return sb.toString();
}
}
'Hacking > Mobile' 카테고리의 다른 글
[Android] 분할 APK 설치 방법 (0) | 2025.05.15 |
---|---|
[Android] 안드로이드 캡처 우회 (0) | 2025.05.15 |
[Android] Activity 화면 강제 호출 취약점 (0) | 2024.10.31 |