安卓实现签名校检(apk签名校验)_怪人怪事

安卓实现签名校检(apk签名校验)

怪人怪事 2023-04-30 21:39www.bnfh.cn怪人怪事

安卓实现签名校检(apk签名校验),本文通过数据整理汇集了安卓实现签名校检(apk签名校验)相关信息,下面一起看看。

#本文目录一览1、Android查看应用签名2、Android系统签名3、Android签名机制之签名文件和数字证书的作用4、AndroidAPP的签名5、Android签名证书过期怎么办?6、android系统签名1Android查看应用签名

打开AndroidStudio,然后选择右边的Gradle标签,选择一个项目,然后选择signingReport这个Task,双击运行

然后选择右下角的GradleConsole,就可以看到签名信息了

使用解压工具解压APK文件,在META-INF文件夹拿到CERT.RSA文件。假设CERT.RSA文件的路径是C:\Users\Administrator\Desk\CERT.RSA。在CMD中输入

就可以得到签名信息了

jks作为签名文件,也可以通过命令行来查看的其中的签名信息,假设签名文件的名称是test_release.jks,在终端中输入

即可得到签名信息

2Android系统签名

有时候,我们开发的apk需要用到系统权限,需要在AndroidManifest.xml中添加共享系统进程属性

这时候apk的签名就需要是系统签名(platform、shared或media)才能正常使用。

常用系统签名方式

这种方式比较麻烦,你需要有编译过的源码环境,并按如下步骤

1、拷贝App源码到Android源码的packages/apps/目录下,且App源码是普通(Eclipse)格式的

2、配置Android.mk,在其中添加

3、使用mm编译App,生成的apk即系统签名

这种方式比在源码环境下签名简单,App可以在Eclipse或AndroidStudio下编译,然后给apk重新签名即可。

但这种方式在频繁调试的时候比较痛苦,即使写成脚本,也需要重复一样的操作。

相关文件

platform.x509.pem、platform.pk8、signapk.jar

文件位置

platform.x509.pem、platform.pk8:

signapk.jar:

signapk源码路径:

签名命令

步骤

1、将相关文件及源apk文件置于同一路径下

2、检查源apk包,去掉META-INF/CERT.SF和META-INF/CERT.RSA文件

3、执行签名命令即可

让AndroidStudio集成系统签名,需要用到一个工具keytool-importkeypair,详见下文。

这个工具的作用是将系统签名的相关信息导入到已有的签名文件里。

工具的使用可以通过–help或README.textile来寻求帮助

platform.x509.pem、platform.pk8、keytool-importkeypair、demo.jks、signature.sh

我的做法是在App根目录新建Signature文件夹专门存放签名相关文件。

步骤

1、生成demo.jks签名文件

2、编写签名脚本signature.sh,内容如下

为脚本文件添加可执行权限

执行脚本

3、配置builde.gradle

在android区域下(与defaultConfig同级)添加配置

这样debug或releaseapk就带有系统签名了。

如果想直接Runapp就是release版且带系统签名的apk,还需修改

这样直接Runapp就是带系统签名的release版apk了。

3Android签名机制之签名文件和数字证书的作用

Android签名机制目的是确保app的可靠通信,其一,要确定消息的来源确实是其申明

的那个人;其二,要保证信息在传递的过程中不被第三方篡改,即使被篡改了,也可以

发觉出来。

所谓数字签名,就是为了解决这两个问题而产生的,它是对非对称加密技术与数字摘要

技术的一个具体的应用。

对于消息的发送者来说,先要生成一对公私钥对,将公钥给消息的接收者。

如果消息的发送者有一天想给消息接收者发消息,在发送的信息中,除了要包含原始的

消息外,还要加上一段消息。这段消息通过如下两步生成

1)对要发送的原始消息提取消息摘要;

2)对提取的信息摘要用自己的私钥加密。

通过这两步得出的消息,就是所谓的原始信息的数字签名。

而对于信息的接收者来说,他所收到的信息,将包含两个部分,一是原始的消息内容,

二是附加的那段数字签名。他将通过以下三步来验证消息的真伪

1)对原始消息部分提取消息摘要,注意这里使用的消息摘要算法要和发送方使用的一致;

2)对附加上的那段数字签名,使用预先得到的公钥解密;

3)比较前两步所得到的两段消息是否一致。如果一致,则表明消息确实是期望的发送者

发的,且内容没有被篡改过;相反,如果不一致,则表明传送的过程中一定出了问题,

消息不可信。

通过这种所谓的数字签名技术,确实可以有效解决可靠通信的问题。如果原始消息在传

送的过程中被篡改了,那么在消息接收者那里,对被篡改的消息提取的摘要肯定和原始

的不一样。并且,由于篡改者没有消息发送方的私钥,即使他可以重新算出被篡改消息

的摘要,也不能伪造出数字签名。

那么数字签名呢?

,数字签名其实就是只有信息的发送者才能产生的别人无法伪造的一段数字

串,这段数字串也是对信息的发送者发送信息真实性的一个有效证明。

不知道大家有没有注意,前面讲的这种数字签名,有一个前提,就是消息的接收者

必须要事先得到正确的公钥。如果一开始公钥就被别人篡改了,那坏人就会被你当成好

人,而真正的消息发送者给你发的消息会被你视作无效的。而且,很多时候根本就不具

备事先沟通公钥的信息通道。那么如何保证公钥的安全可信呢?这就要靠数字证书来解

决了。

所谓数字证书,一般包含以下一些内容

证书的发布机构(Issuer)

证书的有效期(Validity)

消息发送方的公钥

证书所有者(Subject)

数字签名所使用的算法

数字签名

可以看出,数字证书其实也用到了数字签名技术。只不过要签名的内容是消息发送方的

公钥,以及一些其它信息。但与普通数字签名不同的是,数字证书中签名者不是随随便

便一个普通的机构,而是要有一定公信力的机构。这就好像你的大学毕业证书上签名的

一般都是德高望重的校长一样。,这些有公信力机构的根证书已经在设备出厂

前预先安装到了你的设备上了。所以,数字证书可以保证数字证书里的公钥确实是这个

证书的所有者的,或者证书可以用来确认对方的身份。数字证书主要是用来解决公钥的

安全发放问题。

,一下,数字签名和签名验证的大体流程如下图所示

引用链接

4AndroidAPP的签名

AndroidAPP的签名

Android项目以它的包名作为唯一的标识,如果在同一部手机上安装两个包名相同的APP,后者就会覆盖前面安装的应用。为了避免AndroidAPP被随意覆盖,Android要求对APP进行签名。下面介绍对APP进行签名的步骤

1、选择builder菜单下的GenerateSignedAPK

2、弹出签名向导对话框

3、在该对话框中选择数字证书,如果没有数字证书,可以点击Createne按钮,创建数字证书如下图所示

4、输入证书的存储路径及文件名称,密码,有效年份,发布人员的姓名,单位,所在城市,省份,国家等信息,后点击OK按钮,如下图所示,系统会自动带入密码

5、点击Next选择签名后的安装包存放路径,构建类型,点击finish完成安装包的构建

注意

v2是Android7.0中引入了签名版本,v1是jarSignature来自JDK,只勾选v1签名并不会影响什么,在7.0上不会使用更安全的验证方式,只勾选V2签名7.0以下会直接安装完显示未安装,7.0以上则使用了V2的方式验证,为了保证兼容性,可以勾选V1和V2。

在Debug调试版本中,默认会调用调试用的签名证书debug.keystore,该证书默认存放在C:\Users你的用户名.android下。

包名和签名都相同的APP才可以覆盖安装

5Android签名证书过期怎么办?

Android中目前三种签名,签名过期的问题,在Android9.0上新支持的V3签名,已经有解决的方案了。

V1签名遵基于JAR签名。单独验证APK压缩包中的文件。

V2签名APK签名方案V2,在Android7.0引入。是针对APK文件的验证,将签名信息写入签名块中,增强了安全性和验证效率。

V3签名APK签名方案V3,在Android9.0引入。在签名块中又增加了新块(attr),由更小的level块,以链表的形式存储多个证书。

在V3方案中,最旧的证书为新块链表的根节点,以此对新证书签名,确保新证书正确有效。

参考?App签名过期或泄露怎么办?

6android系统签名

也有提到怎么单独给一个apk签名,这里补充一下android的签名权限控制机制。

android的标准签名key有

???testkey

???media

??latform

??hared

??以上的四种,可以在源码的/build/target/product/security里面看到对应的密钥,其中shared.pk8代表私钥,shared.x509.pem公钥,一定是成对出现的。

??其中testkey是作为android编译的时候默认的签名key,如果系统中的apk的android.mk中没有设置LOCAL_CERTIFICATE的值,就默认使用testkey。

??而如果设置成

??LOCAL_CERTIFICATE:=platform

??就代表使用platform来签名,这样的话这个apk就拥有了和system相同的签名,因为系统级别的签名也是使用的platform来签名,此时使用android:sharedUserId="android.uid.system"才有用!

???在/build/target/product/security目录下有个README,里面有说怎么这些key以及使用问题(android4.2)

???从上面可以看出来在源码下的/development/tools目录下有个make_key的脚本,通过传入两个参数就可以生成一对签名用的key。

??其中之一个为key的名字,一般都默认成android本身有的,因为很多地方都默认使用了这些名字,我们自定义的话只需要对第二个参数动手脚,定义如下

??C---CountryName(2lettercode)ST---StateorProvinceName(fullname)L---LocalityName(eg,city)O---OrganizationName(eg,pany)OU---OrganizationalUnitName(eg,section)CN---CommonName(eg,yournameoryourserver’shostname)emailAddress---Contactemailaddre

??在使用上面的make_key脚本生成key的过程中会提示输入passord,我的处理是不输入,直接enter,不要密码!后面解释,用自定义的key替换/security下面的。

??可以看到android源码里面的key使用的第二个参数就是上面README里面的,是公开的,所以要release版本的系统的话,肯定要有自己的签名key才能起到一个安全控用。

??在上面提到如果apk中的编译选项LOCAL_CERTIFICATE没有设置的话,就会使用默认的testkey作为签名key,我们可以修改成自己想要的key,按照上面的步骤一个releasekey,修改android配置在/build/core/config.mk中定义变量

在主makefile文件里面

ifeq?($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/releasekey)

?BUILD_VERSION_TAGS?+=?release-key

这样的话默认的所有签名将会使用releasekey。

修改完之后就要编译了,如果上面的这些key在的时候输入了passord就会出现如下错误

我在网上找到了合理的解释

其实会出现这个错误的最根本的原因是多线程的问题。在编译的时候为了加速一般都会执行make-jxxx,这样本来需要手动输入密码的时候,由于其它线程的运行,就会导致影响当前的输入终端,所以就会导致密码无法输入的情况!

再编译完成之后也可以在build.prop中查看到变量

这样处理了之后编译出来的都是签名过的了,系统才算是release版本

我发现我这样处理之后,整个系统的算是全部按照我的要求签名了。

网上看到还有的签名release办法,应该是针对的版本的,借用学习一下

make?-j4?PRODUCT-product_modul-user?dist

这个怎么跟平时的编译不一样,后面多了两个参数PRODUCT-product_modul-user和dist.编译完成之后回在源码/out/dist/目录内生成个product_modul-target_files开头的zip文件.这就是我们需要进行签名的文件系统.

我的product_modul是full_gotech,后面加“-user”代表的是最终用户版本,关于这个命名以及product_modul等可参考

编译出需要签名的zip压缩包之后,就是利用/security下面的准备的key进行签名了

./build/tools/releasetools/sign_target_files_apks?-d?/build/target/product/security??out/dist/full_gotech-target_files.zip???out/dist/signed_target_files.zi

签名目标文件输出成signed_target_files.zi

如果出现某些apk出错,可以通过在full_gotech-target_files.zip前面加参数"-e="来过滤这些apk.

然后再通过image的脚本生成imag的zip文件,这种方式不适用与我目前的工程源码,没有做过多验证!

Android签名机制可划分为两部分(1)ROM签名机制;(2)第三方APK签名机制。

AndroidAPK实际上是一个jar包,而jar包又是一个zip包。APK包的签名实际上使用的是jar包的签名机制在zip中添加一个META的子目录,其中存放签名信息;而签名是为zip包中的每个文件计算其HASH值,得到签名文件(.sf),然后对签名文件(.sf)进行签名并把签名保存在签名块文件(.dsa)中。

在编译Android源码生成ROM的过程中,会使用build/target/product/security目录中的4个key(media,platform,shared,testkey)来对apk进行签名。其中,.pk8是二进制形式(DER)的私钥,.x509.pem是对应的X509公钥证书(BASE64编码)。build/target/product/security目录中的这几个默认key是没有密码保护的,只能用于debug版本的ROM。

要生成Release版本的ROM,可先生成TargetFiles,再使用带密码的key对TargetFiles重新签名,由重签名的TargetFiles来生成最终的ROM。

可以使用Android源码树中自带的工具“development/tools/make_key”来生成带密码的RSA公私钥对(实际上是通过openssl来生成的):$development/tools/make_keymedia‘/C=CN/ST=Sichuan/L=Chengdu/O=MyOrg/OU=MyDepartment/CN=MyName’上面的命令将生成一个二进制形式(DER)的私钥文件“media.pk8”和一个对应的X509公钥证书文件“media.x509.pem”。其中,/C表示“CountryCode”,/ST表示“StateorProvince”,/L表示“CityorLocality”,/O表示“Organization”,/OU表示“OrganizationalUnit”,/CN表示“Name”。前面的命令生成的RSA公钥的e值为3,可以修改development/tools/make_key脚本来使用F4(0×10001)作为e值(opensslgenrsa的-3参数改为-f4)。

也可以使用JDK中的keytool来生成公私钥对,第三方APK签名一般都是通过keytool来生成公私钥对的。

可以使用opensslx509命令来查看公钥证书的详细信息$opensslx509-inmedia.x509.pem-text-nooutor,$opensslx509-inmedia.x509.pem-informPEM-text-noout

还可以使用JDK中的keytool来查看公钥证书内容,但其输出内容没有opensslx509全面$keytool-printcert-v-filemedia.x509.pem

有了key之后,可以使用工具“build/tools/releasetools/sign_target_files”来对TargetFiles重新签名$build/tools/releasetools/sign_target_files_apks-dne_keys_dir-otarget_files.ziptarget_files_resigned.zip其中,ne_keys_dir目录中需要有四个key(media,platform,shared,releasekey)。注意这里的releasekey将代替默认的testkey(请参考build/tools/releasetools/sign_target_files脚本实现),也就是说,如果某个apk的Android.mk文件中的LOCAL_CERTIFICATE为testkey,那么在生成TargetFiles时是使用的build/target/product/security/testkey来签名的,这里重新签名时将使用ne_keys_dir/releasekey来签名。

uild/tools/releasetools/sign_target_files_apks是通过host/linux-x86/frameork/signapk.jar来完成签名的。也可以直接使用host/linux-x86/frameork/signapk.jar来对某个apk进行签名$java-jarsignapk[-]publickey.x509[.pem]privatekey.pk8input.jaroutput.jar其中,”-”表示还对整个apk包(zip包)进行签名,并把签名放在zip包的ment中。

对于第三方应用开发者而言,对APK签名相对要简单得多。第三方应用开发一般采用JDK中的keytool和jarsigner来完成签名密钥的管理和APK的签名。

使用keytool来生成存储有公私钥对的keystore$keytool-genkey-v-keystoremy-release-key.keystore-aliasmykey-keyalgRSA-keysize2048-validity10000

查看生成的密钥信息$keytool-list-keystoremy-release-key.keystore-aliasmykey-vor,$keytool-list-keystoremy-release-key.keystore-aliasmykey-rfc(注获取Base64格式的公钥证书,RFC1421)

导出公钥证书$keytool-export-keystoremystore-aliasmykey-filemy.der(注二进制格式公钥证书,DER)$keytool-export-keystoremystore-aliasmykey-filemy.pem-rfc(注Base64格式公钥证书,PEM)

对APK进行签名$jarsigner-verbose-keystoremy-release-key.keystoremy_application.apkmykey

验证签名$jarsigner-verify-verbose-certsmy_application.apk

在进行Android二次开发时,有时需要把build/target/product/security下面的公私钥对转换为keystore的形式,可以参考这篇文章把Android源码中的密码对转换为keystore的。

好了,文章到此结束,希望可以帮助到大家。

更多安卓实现签名校检(apk签名校验)相关信息请关注本站。

Copyright © 2016-2025 www.bnfh.cn 怪异网 版权所有 Power by