Android - 已安装的应用 - 完整性检查

时间:2011-08-10 18:01:38

标签: android

  1. 如果有人篡改已安装的Android应用程序(apk文件),是否在启动时进行了任何检查以确保应用程序的完整性不受损害?据我所知,在发布时没有检查,我正在尝试执行以下操作:
  2. 我正在尝试计算已安装应用程序(apk文件)的SHA-1摘要。我知道apk文件就像一个zip文件。它由其他文件组成。但是,我将其视为任何其他文件(只是一个字节流)并尝试计算所有apk文件的SHA-1摘要。这种方法有什么问题吗?以下代码保持为null异常:
  3. private static byte [] getSHA1FromFileContent(String filename) {

    try
    {
        MessageDigest digest = MessageDigest.getInstance("SHA-1");
        //byte[] buffer = new byte[65536]; //created at start.
        final FileInputStream fis = new FileInputStream(filename);
        int n = 0;
        byte[] buffer = null;
        while (n != -1)
        {
            n = fis.read(buffer);
            if (n > 0)
            {
                digest.update(buffer, 0, n);
            }
        }
        byte[] digestResult = digest.digest();
        return digestResult;
    }
    catch (Exception e)
    {
        return null;
    }
    

    }

    作为替代方案,当我尝试从apk文件中检索文件并按如下方式保存单个文件时,我再次保持null异常

    public void unzip() 
    { 
            try  
            { 
              FileInputStream fin = new FileInputStream(_zipFile); 
              ZipInputStream zin = new ZipInputStream(fin); 
              ZipEntry ze = null; 
              while ((ze = zin.getNextEntry()) != null) 
              { 
                Log.v("Decompress", "Unzipping " + ze.getName()); 
    
                if(ze.isDirectory()) { 
                  _dirChecker(ze.getName()); 
                } else { 
                    File dstfile = new File(_location + ze.getName()); 
                    dstfile.createNewFile();
                FileOutputStream fout = new FileOutputStream(dstfile.getPath()); 
                //OutputStream out = openFileOutput(_location + ze.getName(), Context.MODE_PRIVATE);
                for (int c = zin.read(); c != -1; c = zin.read()) { 
                    fout.write(c); 
                  } 
    
                  zin.closeEntry(); 
                  fout.close(); 
                } 
    
              } 
              zin.close(); 
            } 
            catch(Exception e) 
            { 
              Log.e("Decompress", "unzip", e); 
            } 
    }   
    
    1. 我也通过以下方式验证应用程序配置:PreferencesManager.getDefaultSharedPreferences调用提供应用程序的包名称作为输入参数
    2. 为了验证已安装应用程序的完整性,上面的检查是否足够?

1 个答案:

答案 0 :(得分:1)

  

如果有人篡改安装的Android应用程序(apk文件),是否在启动时进行了任何检查以确保应用程序的完整性不受损害?

除了拥有无效的数字签名之外,从操作系统的角度来看,没有“受损”这样的概念。如果有人篡改你的应用程序并签名,这与原始应用程序的操作系统或亚马逊“篡改”用于商店等的应用程序无法区分。

  

这种方法有问题吗?以下代码保持为null异常

首先,您正在处理异常并且不进行日志记录。您会发现在记录异常时调试更加简单。然后,您可以使用堆栈跟踪(例如,来自DDMS)来查找崩溃的行,并修复您的错误,无论它是什么。如果您需要帮助,则需要在问题中包含NullPointerException发生位置的详细信息。

其次,无论谁篡改您的应用,只需删除所有这些代码,如果他们能找到它。

第三,它可能相当慢,使他们更容易找到它。

  

我也通过以下方式验证应用程序配置:PreferencesManager.getDefaultSharedPreferences调用提供应用程序的包名称作为输入参数

我不知道为什么你认为这将是某种形式的验证。

  

为了验证已安装应用程序的完整性,上面的检查是否足够?

恕我直言,上面的检查基本没用。如果您对代码进行模糊处理(例如,使用ProGuard),请从多个地方调用它,并使用this blog post中列出的其他技术,这可能是值得的,但可能太慢了。