2011-08-10 65 views
5
  1. 如果有人篡改已安裝的Android應用程序(apk文件),是否有啓動時進行的任何檢查以確保應用程序的完整性不受影響?據我所知在啓動時沒有執行檢查,我試圖執行以下操作:
  2. 我正在嘗試計算安裝的應用程序(apk文件)的SHA-1摘要。我知道一個apk文件就像一個zip文件。它由其他文件組成。但是,我將它視爲任何其他文件(只是字節流)並嘗試計算所有apk文件的SHA-1摘要。這種方法有什麼問題嗎?下面的代碼保存在給空例外:

私人靜態的byte [] getSHA1FromFileContent(字符串文件名) {Android - 安裝的應用程序 - 完整性檢查

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文件和保存個別文件如下,我再次保持空例外

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

如果有人與已安裝的Android應用程序(apk文件)干預,有沒有在發動,以確保應用程序的完整性的時間做任何檢查不受損害?

從操作系統的角度來看,沒有這樣的概念「妥協」,除非有無效的數字簽名。如果有人用你的應用程序和體徵它,那是無法區分從原始應用程序的操作系統,或在亞馬遜「篡改」的應用程序與它自己的商店等篡改

是否有使用這種方法的任何問題?下面的代碼保持給出空例外

首先,你正在處理異常和不做記錄。你會發現,當你記錄你的異常時,調試更簡單。然後,您可以使用堆棧跟蹤(例如,從DDMS)來查找您正在崩潰的行,並修復您的錯誤,無論它是什麼。如果您需要幫助,則需要在您的問題詳細信息中包含NullPointerException發生的位置。其次,篡改你的應用程序的人只要刪除了所有這些代碼,只要他們能找到它即可。

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

我也通過--PreferencesManager來驗證應用程序的配置。getDefaultSharedPreferences調用提供應用程序的包名稱作爲輸入參數

我不知道爲什麼你認爲這將是某種形式的驗證。

爲了驗證已安裝應用程序的完整性是否足以滿足上述要求?

恕我直言,上述檢查很大程度上是無用的。如果您混淆了您的代碼(例如,使用ProGuard),請從幾個地方調用它,並使用this blog post中列出的其他技術,這可能是值得的,但它可能太慢。

+1

然而,安裝有「真實」版應用程序的設備可以通過更改簽名來檢測「冒名頂替者」升級嘗試,並通過清除原件的私人數據文件來進行響應,以防止其落入冒名頂替者的手。 –

+0

你有鏈接到你的算法的實現嗎?我偶爾看到它討論過,但從未見過實施。請記住,它不適用於亞馬遜AppStore或重新簽名APK的任何其他市場。 – CommonsWare

+0

如果這是我寫的,那麼wipe-on-signature-change是android平臺本身的一個特性,它顯示在logcat中。 IIRC amazon提供開發人員簽署完成的apk選項,但它不是他們唯一的選擇。 –

相關問題