博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Apk去掉签名以及重新签名的方法
阅读量:5245 次
发布时间:2019-06-14

本文共 1963 字,大约阅读时间需要 6 分钟。

转自http://www.cnblogs.com/pleiades/p/6081844.html

Android开发中很重要的一部就是用自己的密钥给Apk文件签名,不经过签名的Apk文件一般是无法安装的,就算装了最后也是失败。

网上流传的“勾选允许安装未知来源的应用”其实跟签不签名没啥关系,说白了就是允许安装不从电子市场上下载的应用而已。

近几日需要修改一个Apk中JNI调用的.so文件,苦于没有apk源代码,只好研究了一下签名相关的问题。当然有很多第三方工具可以做到,但其实JDK中已经提供了强大的签名工具jarsigner。

    1. 去除签名

      其实很简单,用WinRAR打开apk,找到META-INF文件夹,删除MANIFEST.MF之外的所有其他文件即可。

    2. 签名

      运行jarsigner,如果没有设置PATH环境变量,那可以从JDK安装路径下的bin目录中找到,比如我本机的就是C:\Program Files\Java\jdk1.8.0_31\bin\jarsigner.exe

      jarsigner用法如下:

      用法: jarsigner [选项] jar-file 别名       jarsigner -verify [选项] jar-file [别名...][-keystore 
      ] 密钥库位置[-storepass
      <口令>
      ] 用于密钥库完整性的口令[-storetype
      <类型>
      ] 密钥库类型[-keypass
      <口令>
      ] 私有密钥的口令 (如果不同)[-certchain
      <文件>
      ] 替代证书链文件的名称[-sigfile
      <文件>
      ] .SF/.DSA 文件的名称[-signedjar
      <文件>
      ] 已签名的 JAR 文件的名称[-digestalg
      <算法>
      ] 摘要算法的名称[-sigalg
      <算法>
      ] 签名算法的名称[-verify] 验证已签名的 JAR 文件[-verbose[:suboptions]] 签名/验证时输出详细信息。 子选项可以是 all, grouped 或 summary[-certs] 输出详细信息和验证时显示证书[-tsa
      ] 时间戳颁发机构的位置[-tsacert
      <别名>
      ] 时间戳颁发机构的公共密钥证书[-tsapolicyid
      ] 时间戳颁发机构的 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。

转载于:https://www.cnblogs.com/xiayexingkong/p/6762721.html

你可能感兴趣的文章
手机验证码执行流程
查看>>
设计模式课程 设计模式精讲 2-2 UML类图讲解
查看>>
Silverlight 的菜单控件。(不是 Toolkit的)
查看>>
jquery的contains方法
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
桥接模式-Bridge(Java实现)
查看>>
303. Range Sum Query - Immutable
查看>>
【★】浅谈计算机与随机数
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
前台freemark获取后台的值
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
Django 相关
查看>>
git init
查看>>
训练记录
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Hive教程(1)
查看>>