- 如果有人篡改已安裝的Android應用程序(apk文件),是否有啓動時進行的任何檢查以確保應用程序的完整性不受影響?據我所知在啓動時沒有執行檢查,我試圖執行以下操作:
- 我正在嘗試計算安裝的應用程序(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);
}
}
- 我也途經驗證應用程序配置 - PreferencesManager.getDefaultSharedPreferences調用提供的應用程序作爲輸入參數的包名
- 爲了驗證安裝的應用程序的完整性是上面的檢查還不夠嗎?
然而,安裝有「真實」版應用程序的設備可以通過更改簽名來檢測「冒名頂替者」升級嘗試,並通過清除原件的私人數據文件來進行響應,以防止其落入冒名頂替者的手。 –
你有鏈接到你的算法的實現嗎?我偶爾看到它討論過,但從未見過實施。請記住,它不適用於亞馬遜AppStore或重新簽名APK的任何其他市場。 – CommonsWare
如果這是我寫的,那麼wipe-on-signature-change是android平臺本身的一個特性,它顯示在logcat中。 IIRC amazon提供開發人員簽署完成的apk選項,但它不是他們唯一的選擇。 –