您的位置:首页 > 编程语言 > Java开发

Java中使用java.util.zip包读取APK中的RSA信息

2014-09-11 07:56 399 查看

为什么用java.util.zip

zip包可以在不解压包的情况下,获取指定文件的流,这样可以一个普遍的规则来获取指定文件的内容。例如,APK中RSA信息存在在META-INF目录下,并且后缀名为RSA,这样就可以唯一获取到它。当然,也可以获取我们任何想要的文件信息。

当然对于APK,也可以直接全部解压出来再读取文件,这不是我想要的,因此,在多线程情况下,为此需要保存一个目录与APK的映射关系。

为什么能读取APK文件

可以注意到,直接将APK文件的后缀改成ZIP,文件也是能正常解压的。这是表象。关于内延,可以去参阅APK的生成规则,可以发现这两者的编码规则是一致的!

代码

/**
* Get the RSA infomation from APK file
*
* @param ApkPath the path of apkFile
* @return RSA String that base on BASE64
*/
public String getApkRSAContent(String apkPath){
byte[] buf =null;
ZipFile zipFile = null;
try {
zipFile = new ZipFile(apkPath);//打开ZIP、APK文件
Enumeration<?> zipEnum = zipFile.entries(); //获取包中的文件入口(所以文件,包括各级目录下)
while (zipEnum.hasMoreElements()) {
ZipEntry entry = (ZipEntry) zipEnum.nextElement();

if (entry.getName().contains("META-INF")//RSA信息存放在META-INF/*.RSA
&& entry.getName().contains("RSA")) {
InputStream input = null;
input = zipFile.getInputStream(entry);
int size = input.available();//获取文件大小
buf = new byte[size];
int ret =0;
do{
ret = input.read(buf,0,size);
}while(ret != -1);
return Base64.encodeToString(buf, false);//RSA为二进制信息,有些字符不可见,采用Base64编码返回
}
}
}catch(IOException e){
e.printStackTrace();
}finally {
try {
zipFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// log "apk中没有RSA信息";
return null;
}

总结

java.util.zip包,可以在不解压文件的情况下读取包中的内容,对解析压缩包,有很大的帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: