AndroidApk去掉签名以及重新签名的⽅法
Android Apk去掉签名以及重新签名的⽅法
Android开发中很重要的⼀部就是⽤⾃⼰的密钥给Apk⽂件签名,不经过签名的Apk⽂件⼀般是⽆法安装的,就算装了最后也是失败。
⽹上流传的“勾选允许安装未知来源的应⽤”其实跟签不签名没啥关系,说⽩了就是允许安装不从电⼦市场上下载的应⽤⽽已。
近⼏⽇需要修改⼀个Apk中JNI调⽤的.so⽂件,苦于没有apk源代码,只好研究了⼀下签名相关的问题。当然有很多第三⽅⼯具可以做到,但其实JDK中已经提供了强⼤的签名⼯具jarsigner。
1.去除签名
其实很简单,⽤WinRAR打开apk,到META-INF⽂件夹,删除MANIFEST.MF之外的所有其他⽂件即可。
2.签名
android获取真正的签名
运⾏jarsigner,如果没有设置PATH环境变量,那可以从JDK安装路径下的bin⽬录中到,⽐如我本机的就是C:\Program Files\Java\jdk1.8.0_31\
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 -keystore C:\myKey.key -signedjar apk-signed.apk apk-unsigned.apk myKey
待签名的⽂件是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中都有相应的⼯具,图形界⾯,so easy。
感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。