zoukankan      html  css  js  c++  java
  • Apk去掉签名以及重新签名的方法

    转自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 FilesJavajdk1.8.0_31injarsigner.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。

  • 相关阅读:
    双飞翼布局和圣杯布局的对比
    阿里云centos+java环境搭建
    Android零散知识点积累
    [转]linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
    [转]linux shell 获取当前正在执行脚本的绝对路径
    [转+整理]linux shell 将字符串分割成数组
    [转]linux shell 数组建立及使用技巧
    linux shell 入门
    jquery 字符串转为json
    JQuery插件开发入门
  • 原文地址:https://www.cnblogs.com/xiayexingkong/p/6762721.html
Copyright © 2011-2022 走看看