[英]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.