Android应用数字签名详解

目录


概述

Android系统要求所有的应用必须被证书进行数字签名之后才能进行安装。Android系统通过该证书来确认应用的作者,该证书是不需要权威机构认证的,一般情况下应用都是用开发者的自签名证书,该证书是确保应用程序和应用程序作者之间建立信任关系,而不是用来决定用户可以安装哪些应用程序。

应用进行数字签名的好处和注意事项如下:

  1. Android所有的应用程序必须要有数字证书签名,Android系统不会安装一个没有数字证书签名的程序。
  2. Android系统中,系统app使用的是平台证书签名,而第三方app一般使用开发者的自签名证书。
  3. Release版本的第三方app(例如淘宝、支付宝、微信),必须使用一个合适私钥生成的数字证书来给程序进行签名,并且保证每次的迭代新版本都是使用相同的证书进行数字签名。不然的话,新版本和旧版本的数字证书不一致,Android系统会认为这是两个不同的app,导致更新等操作失败。
  4. 数字证书是存在有效期的,这也决定了app的预计生命周期,如果数字证书超期失效,则应用无法安装或者无法正常升级。
  5. Android提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了。 不同的应用程序之间,想共享数据,或者共享代码,那么要让他们运行在同一个进程中,而且要让他们用相同的证书签名。

数字签名证书生成方法

声明:实验生成的keystore只是作为演示使用,并没有实际应用到项目中。大家参考时也要根据我的博客手工修改部分参数,切忌无脑照抄!

Android是使用标准的java工具keytooljarsigner来生成数字证书,而目前市场上第三方IDE(Android Studio和Eclipse)都是通过图形化系统帮我们封装了这两个工具的具体执行步骤。
接下来,我会介绍两种生成数字签名证书的方式,分别通过命令行和Android Studio进行生成。


命令行工具(keytool&&jarsinger)

由于Android的数字签名证书是用java标准工具生成的(路径为:$JAVA_HOME/bin目录下),那我们当然可以在命令行生成数字证书了,具体方法如下。

  1. 使用keytool生成数字签名证书。示例命令如下:
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

参数详解:

  • -keystore : 指定生成数字签名证书的文件名和路径。
  • -alias:指定证书的别名。
  • -keyalg:指定生成证书所需要的算法。
  • -keysize:指定证书大小。
  • -validity:指定证书的有效期,单位为天。

示例截图如下:
keytool

  1. 使用生成的keystore,利用jarsinger为应用进行签名。示例命令如下:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name

参数详解:

  • -sigalg:签名算法的名称。
  • -digestalg:摘要算法的名称。
  • -keystore : 指定签名证书的位置。
  • alias_name:签名证书的别名。

示例截图如下:

jarsigner

  1. google官方同时推荐使用zipalign工具对签名的apk进行优化。该工具位于Android SDK的/build-tools/版本号/目录下。示例命令如下:
zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

示例截图如下:
zipalign


Android Studio

使用命令行的方式可以显得geek,并且让我们更多的了解实现细节。但是,平时应用开发中更多的是注重效率,因此,我们可以采用目前google官方推荐的AS帮我们实现应用数字签名功能。具体步骤如下。

  1. 选择编译Module->Build->Generate Signed APK->选择编译Module->Next。

Generate Signed APK

  1. 选择Create new,创建一个新的数字签名证书。
    Create new

  2. 填写证书信息。
    New Key Store

填写完成之后,我们点击OK,就可以生成我们的数字签名证书了。

上述工作完成后,我们就生成了数字签名证书,但是还没有对我们的apk进行签名。想要用生成的数字证书对apk进行签名,还需要修改当前Module的build.gradle文件,增加签名命令,具体内容如下:

android {
    compileSdkVersion 19
    buildToolsVersion "19.1.0"

    defaultConfig {
        applicationId "××××××"
        minSdkVersion 8
        targetSdkVersion 19
    }

    signingConfigs {
        debug {
            // 配置debug版本的数字签名证书
            storeFile file("/home/wzy/Documents/keystore/simple-weather.jks")
            storePassword "123456"
            keyAlias "release-key"
            keyPassword "123456"
        }
        release {
            // 配置release版本的数字签名证书(为了方便,这里的release版本和debug版本共用一个数字签名证书)
            storeFile file("/home/wzy/Documents/keystore/simple-weather.jks")
            storePassword "123456"
            keyAlias "release-key"
            keyPassword "123456"
        }
    }

    buildTypes {
        release {
            // 配置release版本的数字签名
            signingConfig signingConfigs.release
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
        debug {
            // 配置debug版本的数字签名
            signingConfig signingConfigs.debug
        }
    }
    lintOptions {
        abortOnError false
    }
}

当然,上述命令Android Studio也提供了图形化界面进行操作,可以直接在Module Settings进行设置,截图如下(ps:我还是喜欢手动配置)。
signing


 小结

Android应用可以在debug和release两种模式下进行数字证书签名。在Android Studio中,我们直接点击Run使用的是debug模式,我们在命令行敲击bash gradle :$module_name:build使用的是release模式。
debug模式下签名是为了开发调试,release模式下进行签名则是为了正式发布。
Android SDK提供了一个不需要密码的证书用于在debug模式下进行签名调试,默认存储在$HOME/.android/debug.keystore,但是release版本必须使用自己的数字签名证书。


查看应用签名信息

首先,为什么我们需要查看应用签名信息呢?

是因为,很多第三方提供的SDK服务为了区分应用必须让我们提供数字签名的SHA1值,例如百度地图定位SDK、高德地图定位SDK,为了使用这些服务,我们就必须学会如何查看应用签名信息。


查看自签名证书的信息

我们自签名的证书,由于keystore文件存在于我们可访问的路径下,我们可以直接通过keytool命令去查看证书信息。

示例命令如下:

keytool -v -list -keystore  my-release-key.keystore

输入命令后,是需要输入签名密码的。

参数详解:

  • -list:列出密钥库中的条目。
  • -keystore:数字证书位置。

示例截图如下:
release-key


查看第三方应用或Android系统应用签名证书信息

其实系统应用对开发者来说也是第三方应用,但是只要我们能拿到它的apk,就能知道它的应用签名信息。以我目前使用的乐运动apk为例(com.oxygen.www_3.0_40.apk)。

  1. 用unzip命令解压apk。
unzip com.oxygen.www_3.0_40.apk
  1. 进入META-INF文件,找到其中的CERT.RSA文件。
  2. 使用keytool工具进行信息查看,具体命令如下:
keytool -printcert -file CERT.RSA

参数详解:

  • -printcert:打印证书内容

示例截图如下:
乐运动

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
数字签名是一种用于验证和确保数字数据完整性、认证身份和防止篡改的技术。它基于公钥密码学的原理。数字签名使用私钥对数据进行加密生成签名,然后使用对应的公钥进行验证签名的有效性。 数字签名的过程包括以下步骤: 1. 生成密钥对:首先,需要生成一对密钥,包括一个私钥和一个公钥。私钥由签名者保留,公钥可以公开发布。 2. 数据签名签名者使用私钥对要签名的数据进行加密生成签名。这个签名是唯一的,任何对数据进行篡改都会导致签名验证失败。 3. 签名验证:接收者使用签名者的公钥对接收到的数据和签名进行解密和验证。如果解密后的签名与解密后的数据匹配,说明数据完整且未被篡改。 数字证书是用于证明公钥的真实性和拥有者身份的电子文档。数字证书由权威机构(如数字证书颁发机构)颁发,其中包含公钥、证书持有者信息和颁发机构的数字签名数字证书的作用是确保公钥的合法性和信任,以及提供验证身份的方式。它可以用于安全通信、身份认证、数据完整性保护等多个领域。 在使用数字证书进行数字签名时,签名者的公钥会包含在数字证书中,接收者可以使用数字证书中的公钥对签名进行验证。数字证书的数字签名可以保证证书的真实性和可靠性。 总结来说,数字签名是一种通过加密和解密技术,用于验证数据完整性和身份认证的方法。而数字证书则是一种包含公钥、身份信息和数字签名的电子文档,用于证明公钥的真实性和拥有者身份。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值