繁体   English   中英

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

[英]Android - Installed apps - integrity check

  1. 如果有人篡改已安装的 android 应用程序(apk 文件),在启动时是否进行了任何检查以确保应用程序的完整性不受影响? 据我了解,在启动时没有执行任何检查,我正在尝试执行以下操作:
  2. 我正在尝试计算已安装应用程序(apk 文件)的 SHA-1 摘要。 我知道 apk 文件就像 zip 文件。 它由其他文件组成。 但是,我将其视为任何其他文件(只是 stream 字节)并尝试计算所有 apk 文件的 SHA-1 摘要。 这种方法有什么问题吗? 以下代码继续给出 null 异常:

私人 static 字节 [] getSHA1FromFileContent(字符串文件名){

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 调用提供应用程序的 package 名称作为输入参数来验证应用程序配置
  2. 为了验证已安装应用程序的完整性,上述检查是否足够?

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

从操作系统的角度来看,除了具有无效的数字签名之外,没有“妥协”这样的概念。 如果有人篡改您的应用程序并对其进行签名,那么操作系统与您的原始应用程序或亚马逊“篡改”其商店后的应用程序等无法区分。

这种方法有什么问题吗? 以下代码继续给出 null 异常

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

其次,任何篡改您的应用程序的人都会简单地删除所有这些代码,如果他们能找到的话。

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

我还通过 - PreferencesManager.getDefaultSharedPreferences 调用提供应用程序的 package 名称作为输入参数来验证应用程序配置

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

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

恕我直言,上述检查在很大程度上是无用的。 如果您混淆了您的代码(例如,使用 ProGuard),从多个地方调用它,并使用本博文中概述的其他技术,也许值得,但它可能太慢了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM