APPセキュリティのAPK整合性検査
APPセキュリティのAPK整合性検査
前言
APK整合性チェックは,絶対的なセキュリティは難しいが,アプリケーションのセキュリティと解読の難易度を向上させることができる.
一、APKの安全性を認識する
危害を及ぼす
クライアントファイルを変更してクライアントの動作を改ざんできます.攻撃者はクライアントに自分が作った釣りサイトを表示させ、ユーザー情報を盗むことができる.
二、完全性検査原理
整合性検査のいくつかの方法 CRC検査 MD 5値チェック SHA 1値チェック 一般的なandroid整合性検出検出署名 classes.dex apk 全体を検証する
署名の検出
AndroidはApkファイルごとに署名を行い、Apkファイルのインストール時にその署名情報を比較してプログラムの整合性を判断し、そのApkファイルがインストールできるかどうかを決定し、ある程度安全な目的を達成する. MANIFEST.MF:これは要約ファイルです.プログラムはApkパケット中のすべてのファイル(entry)を巡回し、フォルダ以外の非署名ファイルのファイルをSHA 1毎に要約情報を生成し、Base 64で符号化する.apkパッケージのファイルを変更すると、apkインストールチェック時に変更後のファイル要約情報がMANIFESTとなります.MFの検査情報が異なるため、プログラムが正常にインストールされません. CERT.SF:要約に対する署名ファイルです.前のステップで生成するMANIFEST.MFは,SHA 1−RSAアルゴリズムを用いて開発者の秘密鍵で署名する.公開鍵は、インストール時にのみ使用できます.復号後、暗号化されていない要約情報(すなわち、MANIFEST.MFファイル)と比較し、一致する場合は、内容が異常に変更されていないことを示す. CERT.RSAファイルには、公開鍵、採用された暗号化アルゴリズムなどの情報が格納されている.システムは署名ファイルを復号し、必要な公開鍵はこのファイルから取り出します.この3つのファイルはapk META-INFOフォルダ にあります.
結論:上記のまとめから分かるように、META-INFOではそのファイルがループしており、Androidプログラムの安全性を保証していると言われています.△開発者のプログラムが攻撃者によって修正されないことを防止するだけで、開発者の公開鍵が攻撃者に対して得られたり、開発者が攻撃プログラムを開発したりした場合、Androidシステムは検出できません.
システムは以上の方法で防止できますが、rootの携帯電話であれば安全ではありませんので、サーバーでチェックすることをお勧めします.
検査classes.dex
crc 32でclasses.dexファイルの整合性を検証する
apk全体の検証
ハッシュ値でapk全体の整合性を検証する
crc値とsha 1値をサーバに置いて処理します
前言
APK整合性チェックは,絶対的なセキュリティは難しいが,アプリケーションのセキュリティと解読の難易度を向上させることができる.
一、APKの安全性を認識する
危害を及ぼす
クライアントファイルを変更してクライアントの動作を改ざんできます.攻撃者はクライアントに自分が作った釣りサイトを表示させ、ユーザー情報を盗むことができる.
二、完全性検査原理
整合性検査のいくつかの方法
署名の検出
AndroidはApkファイルごとに署名を行い、Apkファイルのインストール時にその署名情報を比較してプログラムの整合性を判断し、そのApkファイルがインストールできるかどうかを決定し、ある程度安全な目的を達成する.
結論:上記のまとめから分かるように、META-INFOではそのファイルがループしており、Androidプログラムの安全性を保証していると言われています.△開発者のプログラムが攻撃者によって修正されないことを防止するだけで、開発者の公開鍵が攻撃者に対して得られたり、開発者が攻撃プログラムを開発したりした場合、Androidシステムは検出できません.
システムは以上の方法で防止できますが、rootの携帯電話であれば安全ではありませんので、サーバーでチェックすることをお勧めします.
検査classes.dex
crc 32でclasses.dexファイルの整合性を検証する
public class MainActivity extends Activity {
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String apkPath = getPackageCodePath();
Long dexCrc = Long.parseLong(getString(R.string.classesdex_crc));
// dexCrc
try
{
ZipFile zipfile = new ZipFile(apkPath);
ZipEntry dexentry = zipfile.getEntry("classes.dex");
Log.i("verification","classes.dexcrc="+dexentry.getCrc());
if(dexentry.getCrc() != dexCrc){
Log.i("verification","Dexhas been modified!");
}else{
Log.i("verification","Dex hasn't been modified!");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
apk全体の検証
ハッシュ値でapk全体の整合性を検証する
public class MainActivity extends Activity {
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String apkPath = getPackageCodePath();
MessageDigest msgDigest = null;
try {
msgDigest = MessageDigest.getInstance("SHA-1");
byte[] bytes = new byte[1024];
int byteCount;
FileInputStream fis = new FileInputStream(new File(apkPath));
while ((byteCount = fis.read(bytes)) > 0)
{
msgDigest.update(bytes, 0, byteCount);
}
BigInteger bi = new BigInteger(1, msgDigest.digest());
String sha = bi.toString(16);
fis.close();
//
} catch (Exception e) {
e.printStackTrace();
}
}
}
crc値とsha 1値をサーバに置いて処理します