Android Apk去掉签名以及重新签名的方法
AndroidApk去掉签名以及重新签名的方法
Android开发中很重要的一部就是用自己的密钥给Apk文件签名,不经过签名的Apk文件一般是无法安装的,就算装了最后也是失败。
网上流传的“勾选允许安装未知来源的应用”其实跟签不签名没啥关系,说白了就是允许安装不从电子市场上下载的应用而已。
近几日需要修改一个Apk中JNI调用的.so文件,苦于没有apk源代码,只好研究了一下签名相关的问题。当然有很多第三方工具可以做到,但其实JDK中已经提供了强大的签名工具jarsigner。
1.去除签名
其实很简单,用WinRAR打开apk,找到META-INF文件夹,删除MANIFEST.MF之外的所有其他文件即可。
2.签名
运行jarsigner,如果没有设置PATH环境变量,那可以从JDK安装路径下的bin目录中找到,比如我本机的就是C:\ProgramFiles\Java\jdk1.8.0_31\bin\jarsigner.exe
jarsigner用法如下:
用法:jarsigner[选项]jar-file别名 jarsigner-verify[选项]jar-file[别名...] [-keystore<url>]密钥库位置 [-storepass<口令>]用于密钥库完整性的口令 [-storetype<类型>]密钥库类型 [-keypass<口令>]私有密钥的口令(如果不同) [-certchain<文件>]替代证书链文件的名称 [-sigfile<文件>].SF/.DSA文件的名称 [-signedjar<文件>]已签名的JAR文件的名称 [-digestalg<算法>]摘要算法的名称 [-sigalg<算法>]签名算法的名称 [-verify]验证已签名的JAR文件 [-verbose[:suboptions]]签名/验证时输出详细信息。 子选项可以是all,grouped或summary [-certs]输出详细信息和验证时显示证书 [-tsa<url>]时间戳颁发机构的位置 [-tsacert<别名>]时间戳颁发机构的公共密钥证书 [-tsapolicyid<oid>]时间戳颁发机构的TSAPolicyID [-altsigner<类>]替代的签名机制的类名 [-altsignerpath<路径列表>]替代的签名机制的位置 [-internalsf]在签名块内包含.SF文件 [-sectionsonly]不计算整个清单的散列 [-protected]密钥库具有受保护验证路径 [-providerName<名称>]提供方名称 [-providerClass<类>加密服务提供方的名称 [-providerArg<参数>]]...主类文件和构造器参数 [-strict]将警告视为错误
比较常用的参数就是指定keystore的位置和签名后的文件,举例如下:
jarsigner-keystoreC:\myKey.key-signedjarapk-signed.apkapk-unsigned.apkmyKey
待签名的文件是apk-unsigned.apk,签名后的apk是apk-signed.apk。我们也可以不指定-signedjar参数,则在待签名的apk上直接签名。最后一个myKey是我的keystore的别名。
签名完成后再用WinRAR打开,会发现META-INF目录下多了MYKEY.RSA和MYKEY.SF两个文件,他们分别是:
MANIFEST.MF中保存了所有其他文件的SHA-1并base64编码后的值。
MYKEY.SF中也有其他文件的SHA-1并base64编码的值,而且还多一个MANIFEST.MF文件的SHA-1并base64编码后的值
MYKEY.RSA包含了公钥信息和发布机构信息
后两个文件的名称和我的key别名转换为大写后一致。
关于如何生成本机的keystore就不再赘述了,在AndroidStudio和Eclipse中都有相应的工具,图形界面,soeasy。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!