[英]Android - Installed apps - integrity check
私人 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);
}
}
如果有人篡改已安裝的 android 應用程序(apk 文件),在啟動時是否進行了任何檢查以確保應用程序的完整性不受影響?
從操作系統的角度來看,除了具有無效的數字簽名之外,沒有“妥協”這樣的概念。 如果有人篡改您的應用程序並對其進行簽名,那么操作系統與您的原始應用程序或亞馬遜“篡改”其商店后的應用程序等無法區分。
這種方法有什么問題嗎? 以下代碼繼續給出 null 異常
首先,您正在處理異常並且不進行日志記錄。 當您記錄異常時,您會發現調試要簡單得多。 然后,您可以使用堆棧跟蹤(例如,來自 DDMS)來查找您正在崩潰的行,並修復您的錯誤,無論它是什么。 如果您需要這方面的幫助,您需要在問題中包含有關NullPointerException
發生位置的詳細信息。
其次,任何篡改您的應用程序的人都會簡單地刪除所有這些代碼,如果他們能找到的話。
第三,它可能相當慢,使他們更容易找到它。
我還通過 - PreferencesManager.getDefaultSharedPreferences 調用提供應用程序的 package 名稱作為輸入參數來驗證應用程序配置
我不知道你為什么認為這將是某種形式的驗證。
為了驗證已安裝應用程序的完整性,上述檢查是否足夠?
恕我直言,上述檢查在很大程度上是無用的。 如果您混淆了您的代碼(例如,使用 ProGuard),從多個地方調用它,並使用本博文中概述的其他技術,也許值得,但它可能太慢了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.