当前位置:   article > 正文

APP安全之APK完整性校验

ctf如何对apk文件进行hash值校验

APP安全之APK完整性校验

前言

APK 完整性校验,虽然很难做到绝对的安全,但能提高应用的安全性和破解难度。

一、认识APK安全性

危害

可以通过修改客户端文件篡改客户端行为。攻击者可以让客户端显示自己制作的钓鱼网站,偷取用户信息

二、完整性校验原理

完整性校验的几种方式

  1. CRC校验
  2. MD5值校验
  3. SHA1值校验

常见android完整性检测

  1. 检测签名
  2. 校验classes.dex
  3. 校验整个apk
检测签名

Android对每一个Apk文件都会进行签名,在Apk文件安装时,系统会对其签名信息进行比对,判断程序的完整性,从而决定该Apk文件是否可以安装,在一定程度上达到安全的目的。

  1. MANIFEST.MF:这是摘要文件。程序遍历Apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个用SHA1生成摘要信息,再用Base64进行编码。如果你改变了apk包中的文件,那么在apk安装校验时,改变后的文件摘要信息与MANIFEST.MF的检验信息不同,于是程序就不能成功安装。
  2. CERT.SF:这是对摘要的签名文件。对前一步生成的MANIFEST.MF,使用SHA1-RSA算法,用开发者的私钥进行签名。在安装时只能使用公钥才能解密它。解密之后,将它与未加密的摘要信息(即,MANIFEST.MF文件)进行对比,如果相符,则表明内容没有被异常修改。
  3. CERT.RSA文件中保存了公钥、所采用的加密算法等信息。系统对签名文件进行解密,所需要的公钥就是从这个文件里取出来的。
    这三个文件在apk META-INFO文件夹

结论:从上面的总结可以看出,META-INFO里面的说那个文件环环相扣,从而保证Android程序的安全性。(只是防止开发者的程序不被攻击者修改,如果开发者的公私钥对对攻击者得到或者开发者开发出攻击程序,Android系统都无法检测出来。)

虽然系统通过以上方式可以防止,但如果是root的手机就不安全了,建议通过服务器来校验,

校验classes.dex

用crc32对classes.dex文件的完整性进行校验

  1. public class MainActivity extends Activity {
  2. @Override
  3. protected void onCreate(BundlesavedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. String apkPath = getPackageCodePath();
  7. Long dexCrc = Long.parseLong(getString(R.string.classesdex_crc));
  8. //建议将dexCrc值放在服务器做校验
  9. try
  10. {
  11. ZipFile zipfile = new ZipFile(apkPath);
  12. ZipEntry dexentry = zipfile.getEntry("classes.dex");
  13. Log.i("verification","classes.dexcrc="+dexentry.getCrc());
  14. if(dexentry.getCrc() != dexCrc){
  15. Log.i("verification","Dexhas been modified!");
  16. }else{
  17. Log.i("verification","Dex hasn't been modified!");
  18. }
  19. } catch (IOException e) {
  20. // TODO Auto-generated catch block
  21. e.printStackTrace();
  22. }
  23. }
  24. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
校验整个apk

用哈希值对整个apk完整性进行校验

  1. public class MainActivity extends Activity {
  2. @Override
  3. protected void onCreate(BundlesavedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. String apkPath = getPackageCodePath();
  7. MessageDigest msgDigest = null;
  8. try {
  9. msgDigest = MessageDigest.getInstance("SHA-1");
  10. byte[] bytes = new byte[1024];
  11. int byteCount;
  12. FileInputStream fis = new FileInputStream(new File(apkPath));
  13. while ((byteCount = fis.read(bytes)) > 0)
  14. {
  15. msgDigest.update(bytes, 0, byteCount);
  16. }
  17. BigInteger bi = new BigInteger(1, msgDigest.digest());
  18. String sha = bi.toString(16);
  19. fis.close();
  20. //这里添加从服务器中获取哈希值然后进行对比校验
  21. } catch (Exception e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

我们将把crc值和sha1值放在服务器做处理

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/792258
推荐阅读
相关标签
  

闽ICP备14008679号