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);
}
}
答案 0 :(得分:1)
如果有人篡改安装的Android应用程序(apk文件),是否在启动时进行了任何检查以确保应用程序的完整性不受损害?
除了拥有无效的数字签名之外,从操作系统的角度来看,没有“受损”这样的概念。如果有人篡改你的应用程序并签名,这与原始应用程序的操作系统或亚马逊“篡改”用于商店等的应用程序无法区分。
这种方法有问题吗?以下代码保持为null异常
首先,您正在处理异常并且不进行日志记录。您会发现在记录异常时调试更加简单。然后,您可以使用堆栈跟踪(例如,来自DDMS)来查找崩溃的行,并修复您的错误,无论它是什么。如果您需要帮助,则需要在问题中包含NullPointerException
发生位置的详细信息。
其次,无论谁篡改您的应用,只需删除所有这些代码,如果他们能找到它。
第三,它可能相当慢,使他们更容易找到它。
我也通过以下方式验证应用程序配置:PreferencesManager.getDefaultSharedPreferences调用提供应用程序的包名称作为输入参数
我不知道为什么你认为这将是某种形式的验证。
恕我直言,上面的检查基本没用。如果您对代码进行模糊处理(例如,使用ProGuard),请从多个地方调用它,并使用this blog post中列出的其他技术,这可能是值得的,但可能太慢了。为了验证已安装应用程序的完整性,上面的检查是否足够?