zoukankan      html  css  js  c++  java
  • Android签名机制:生成keystore、签名、查看签名信息

    Android独有的安全机制,除了权限机制外,另外一个就是签名机制了。签名机制主要用在以下两个主要场合起到其作用:升级App和权限检查。

    升级App

    用户在升级一款已经安装过的App时,如果程序的修改来自于同一来源,则允许升级安装,否则会提示签名不一致无法安装的提示。

    权限检查

    我曾在Android Permission权限机制的具体使用一文中提过,对于申请权限的  protection level 为 signature 或者 signatureOrSystem 的,会检查权限申请者和权限声明者的证书是否是一致的。

    至于签名机制的原理及其他作用,此不详述,本文主要介绍,签名文件key的生成、用key去签名apk文件及查看签名的方法。

    生成keystore

    创建keystore,需要用到keytool.exe (位于jdk_xxjrein目录下),具体做法如下:

    (注:

    ///

    Mac下jdk的安装路径

    苹果系统已经包含完整的J2SE,其中就有JDK和JVM(苹果叫VM)。 
    如果要在MAC系统下开发CODE。可以先装个IDE(NETBEANS/Eclipse等),而后不需要装JDK和JVM了,MAC下已经帮你下载好,安装完成,配置好路径。当然如果要升级JDK,那当然要自己下载安装了。 

    在MAC系统中,jdk的安装路径与windows不同,默认目录是:/System/Libray/Frameworks/JavaVM.Framwork/。 
    在这个目录下有个Versions目录,里面有不同版本的jdk。

    ///

    keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore

    #说明:

    #    -genkey 产生密钥

    #    -alias demo.keystore 别名 demo.keystore

    #    -keyalg RSA 使用RSA算法对签名加密

    #    -validity 40000 有效期限4000天

    #    -keystore demo.keystore

    ///

    (这里需要注意,命令行下生成keystore的时候会有乱码 参考以下文字:

    首先,我们需要一个keystore,当然已经有了的话就不用这一步了:
    cmd下:
    进入到jdk的bin目录,这样的话,android.keystore文件就会生成在这个目录下,签名的时候我们需要这个文件
    C:Program FilesJavajdk1.6.0_10in>keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore 
    输入keystore密码:
    再次输入新密码:
    您的名字与姓氏是什么?
      [Unknown]:  qiaoling您的组织单位名称是什么?
      [Unknown]:  www.chinaandroid.com
    您的组织名称是什么?
      [Unknown]:  www.chinaandroid.com
    您所在的城市或区域名称是什么?
      [Unknown]:  haidian
    您所在的州或省份名称是什么?
      [Unknown]:  BJ
    该单位的两字母国家代码是什么
      [Unknown]:  86
    CN=qiaoling, OU=www.chinaandroid.com, O=www.chinaandroid.com, L=haidian, ST=BJ, C=86 正确吗?
      [否]:  Y
    输入<android.keystore>的主密码(如果和 keystore 密码相同,按回车):

    其中参数-validity为证书有效天数,这里我们写的大些10000天。还有在输入密码时没有回显(尽管输就是啦) 并且 退格,tab等都属于密码内容,这个密码在给.apk文件签名的时候需要.

    然后签名:
    Eclipse中,右击需要签名的工程-->android tools-->export signed application package...
    出现下面对话框,选择需要签名的工程

    next,选择上面生成的android.keystore文件位置和设置的密码

    next

    next,选择签名生成文件的位置和名称

    finish,搞定啦...

    ///

    对apk进行签名

    使用产生的keystore对apk签名,使用到的是jarsigner.exe ,该工具位于jdk_xxin目录下,命令如下:

    jarsigner -verbose -keystore demo.keystore -signedjar test_signed.apk test.apk demo.keystore

    #    test_signed.apk是签名之后的文件

    #    test.apk是需要签名的文件

    另外需要注意的是,如果你的jdk版本在1.7以上,你在对apk签名时,需要加上这个参数:

    1

    -digestalg SHA1 -sigalg MD5withRSA

    否则同样会出现:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]的错误。

    (注:

    使用jarsigner给android_infoAssistant.apk 
    文件签名,如下所示: 
    E:android_publish>"E:jdk1.6injarsigner.exe" -verbose -keystore alex_android.keystore -signedjar android_assistant.apk assistant.apk alex_android.keystore 

    输入密匙的口令短语: 
    ...... (注:这里是输入密码)
    通过上面的命令就可以讲未签名的assistant.apk 文件签名为android_assistant.apk 

    最后验证是否签名成功 
    E:android_publish>"E:jdk1.6injarsigner.exe" -verify android_assistant.apk 
    如果成功则 
    输出: 
    jar 已验证 )

    查看签名信息

    1、查看keystore的信息

    1

    keytool -list -keystore demo.keystore -alias mykey -v

    2、查看keystore的公钥证书信息

    1

    keytool -list -keystore demo.keystore -alias mykey -rfc

    (注:获取Base64格式的公钥证书,RFC 1421)

    3、查看apk的签名信息

    1

    jarsigner -verify -verbose -certs <your_apk_path.apk>

  • 相关阅读:
    javascript学习笔记-数据类型
    chrome console.log API
    Mysql下SELECT的结果集作为UPDATE的WHERE条件时的SQL语法
    Ajax、Comet、Websocket、SSE
    Model View Controller(MVC) in PHP
    区别Transform、Transition、Animation
    WAI-ARIA无障碍网页应用属性完全展示
    理解 PHP output buffer
    清除Jquery动画的队列
    git常用命令
  • 原文地址:https://www.cnblogs.com/rosepotato/p/3709550.html
Copyright © 2011-2022 走看看