Apk去掉签名以及重新签名的方法

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 <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。

时间: 2024-08-14 01:28:43

Apk去掉签名以及重新签名的方法的相关文章

Android签名机制之---签名过程具体解释

一.前言 又是过了好长时间,没写文章的双手都有点难受了.今天是圣诞节,还是得上班.由于前几天有一个之前的同事,在申请微信SDK的时候,遇到签名的问题,问了我一下,结果把我难倒了..我说Android中的签名大家都会熟悉的,就是为了安全,不让别人改动你的apk,可是我们真正的有了解多少呢?所以准备两篇文章好好介绍一下Android中签名机制. 在说道Android签名之前,我们须要了解的几个知识点 1.数据摘要(数据指纹).签名文件,证书文件 2.jarsign工具签名和signapk工具签名 3

[转载] Android签名机制之—签名过程详解

本文转载自: http://www.wjdiankong.cn/android%E7%AD%BE%E5%90%8D%E6%9C%BA%E5%88%B6%E4%B9%8B-%E7%AD%BE%E5%90%8D%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3/ 一.前言 又是过了好长时间,没写文章的双手都有点难受了.今天是圣诞节,还是得上班.因为前几天有一个之前的同事,在申请微信SDK的时候,遇到签名的问题,问了我一下,结果把我难倒了..我说Android中的签名大家都会熟悉

Android签名机制之---签名过程详解

一.前言 又是过了好长时间,没写文章的双手都有点难受了.今天是圣诞节,还是得上班.因为前几天有一个之前的同事,在申请微信SDK的时候,遇到签名的问题,问了我一下,结果把我难倒了..我说Android中的签名大家都会熟悉的,就是为了安全,不让别人修改你的apk,但是我们真正的有了解多少呢?所以准备两篇文章好好介绍一下Android中签名机制. 在说道Android签名之前,我们需要了解的几个知识点 1.数据摘要(数据指纹).签名文件,证书文件 2.jarsign工具签名和signapk工具签名 3

《Nodejs开发加密货币》之十九:签名和多重签名

前言 加密货币是一种数字资产,随着区块链等相关技术的创新和突破,很多有形或无形资产实现了去中心化.比如我们这里分享的 亿书 就是要把数字出版物版权进行保护,实现去中心化,解决业界多年来版权保护不力的难题. 无论数字资产,还是数字出版版权,都是有明确所有权的,当前实现数字资产所属的技术手段就是本篇要介绍的签名.而多重签名是对签名的扩展使用,给数字资产转移提供了安全保障和技术手段.本篇,从基本概念入手,详细了解签名和多重签名的作用和代码实现. 源码 主要源码地址: signatures.js htt

Android 判断debug签名和release签名

判断debug签名和release签名 思路是:可以获取到package里的签名信息Signature对象,在Signature对象里有hashCode()方法,可以用来标识Signature对象.目前我采用的方法是先运行release版的app,然后记录下该包里Signature对象的hashcode:在程序里判断取到的Signature对象的hashcode是否与该值相同,相同就是release,否则是debug public boolean checkAppReleaseVersion()

openssl生成签名与验证签名

继上一篇RSA对传输信息进行加密解密,再写个生成签名和验证签名. 一般,安全考虑,比如接入支付平台时,请求方和接收方要互相验证是否是你,就用签名来看. 签名方式一般两种,对称加密和非对称加密.对称加密就是双方互相有一个相同的key.非对称比如就是公钥和私钥. 利用非对称openssl,下面是生成签名和验证签名的php示例. <?php $arrParams = array( 'z' => 1, 'a' => 2, 'n' => "hello", 'p' =>

PHP去掉数组重复值二种方法实例

PHP两种去掉数组重复值的方法,分别使用foreach方法和array_unique方法. 去除一个数组中的重复值,可以使用foreach方法,也可以使用array_unique方法. <?php $arrF = array(); $arrS = array(); $intTotal = 100; $intRand = 10; for($i=0; $i < $intTotal; $i++) { $arrF[] = rand(1, $intRand); $arrS[] = rand(1, $in

RSA公钥加密—私钥解密&amp;私钥加密—公钥解密&amp;私钥签名—公钥验证签名

关于RSA算法,前面有介绍,点击打开链接. 这里直接有实现. 代码太多就不直接贴了,免积分下载. http://download.csdn.net/detail/acmjk/7310847 RSA公钥加密-私钥解密&私钥加密-公钥解密&私钥签名-公钥验证签名,布布扣,bubuko.com

Mac App Store应用签名和pkg签名(必须签名后才能销售)

App签名 只有用苹果颁发的证书签名的应用才能在App Store上进行销售,所以我们开发的应用必须打上签名. 签名有两种方式,一是使用Xcode,在配置里面设置签名,编译出来的app就有了签名:二是使用codesign命令行进行手动签名.这里我们采用的是使用手动codesign对app进行签名. codesign -s “your Application Certificates”app_path 比如你要对MyAppDemo.app进行签名,并使用您之前申请的证书. codesign -s

强命名程序集,签名,延迟签名

强命名程序集 如果一个程序集有一个唯一的标记,那么这个程序集就可以叫做强命名程序集.在.NET框架中是通过公钥/私钥加密来产生这个唯一标记的.一个强命名程序集包含四个唯一标志程序集的特性:文件名(没有扩展名),版本号,语言文化信息(如果有的话),公有秘钥. 这些信息存储在程序集的清单(manifest)中.清单包含了程序集的元数据,并嵌入在程序集的某个文件中.下面的字符串标识了二个不同的程序集文件: “MyType, Version=1.0.1.0,Culture=neutral, Public