Android的数字签名

Android的数字签名,第1张

    要确保可靠通信,要解决两个问题:第一,要确定消息的来源确实是其申明的那个人;其次,要保证信息在传递的过程中不被第三方篡改,即使被篡改了,也可以发觉出来。

    数字签名,就是为了解决这两个问题而产生的,它是对前面提到的非对称加密技术与数字摘要技术的一个具体的应用。

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

    如果消息的发送者有一天想给消息接收者发消息,在发送的信息中,除了要包含原始的消息外,还要加上另外一段消息。这段消息通过如下两步生成:

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

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

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

    而对于信息的接收者来说,他所收到的信息,将包含两个部分,一是原始的消息内容,二是附加的那段数字签名。他将通过以下三步来验证消息的真伪:

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

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

3)比较前两步所得到的两段消息是否一致。如果一致,则表明消息确实是期望的发送者发的,且内容没有被篡改过;相反,如果不一致,则表明传送的过程中一定出了问题,消息不可信。

    通过这种数字签名技术,确实可以有效解决可靠通信的问题。如果原始消息在传送的过程中被篡改了,那么在消息接收者那里,对被篡改的消息提取的摘要肯定和原始的不一样。并且,由于篡改者没有消息发送方的私钥,即使他可以重新算出被篡改消息的摘要,也不能伪造出数字签名。

    综上所述,数字签名其实就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。

    很多时候根本就不具备事先沟通公钥的信息通道。那么如何保证公钥的安全可信呢?这就要靠数字证书来解决了。

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

    证书的发布机构(Issuer)

    证书的有效期(Validity)

    消息发送方的公钥

    证书所有者(Subject)

·   指纹以及指纹算法

    数字签名

    解压 Android签名apk之后,会有一个META-INF文件夹,这里有三个文件:

MANIFESTMF

逐一遍历里面的所有条目,如果是目录就跳过,如果是一个文件,就用SHA1(或者SHA256)消息摘要算法提取出该文件的摘要然后进行BASE64编码后,作为“SHA1-Digest”属性的值写入到MANIFESTMF文件中的一个块中。该块有一个“Name”属性,其值就是该文件在apk包中的路径。

CERTSF

1》计算这个MANIFESTMF文件的整体SHA1值,再经过BASE64编码后,记录在CERTSF主属性块(在文件头上)的“SHA1-Digest-Manifest”属性值值下

2》逐条计算MANIFESTMF文件中每一个块的SHA1,并经过BASE64编码后,记录在CERTSF中的同名块中,属性的名字是“SHA1-Digest

CERTRSA

     会把之前生成的 CERTSF文件, 用私钥计算出签名, 然后将签名以及包含公钥信息的数字证书一同写入  CERTRSA  中保存。CERTRSA是一个满足PKCS7格式的文件。

    如果你改变了apk包中的任何文件,那么在apk安装校验时,改变后的文件摘要信息与MANIFESTMF的检验信息不同,于是验证失败,程序就不能成功安装。

    其次,如果你对更改的过的文件相应的算出新的摘要值,然后更改MANIFESTMF文件里面对应的属性值,那么必定与CERTSF文件中算出的摘要值不一样,照样验证失败。

    最后,如果你还不死心,继续计算MANIFESTMF的摘要值,相应的更改CERTSF里面的值,那么数字签名值必定与CERTRSA文件中记录的不一样,还是失败。

    那么能不能继续伪造数字签名呢?不可能,因为没有数字证书对应的私钥。

所以,如果要重新打包后的应用程序能再Android设备上安装,必须对其进行重签名。

参考如下内容:

查看三方应用或是系统应用签名

用winrar打开待查看的apk,将其中META-INF文件夹解压出来,得到其中的CERTRSA文件,通过命令keytoolexe命令查看证书信息

可以查看签名的MD5、SHA1、SHA256值及签名算法

keytool -printcert -file META-INF/CERTRSA

因工作需要对系统的wifi和以太网进行配置,需要获取到系统权限以后才能进行 *** 作,因此研究了下对apk 进行系统签名以获取系统权限,其实本来打算如果root可以的话直接通过root的方式(设备已经root),后来找了半天发现没有api进行修改,无奈只能进行系统签名了,有童鞋知道root方式修改不妨告诉我一下。

这些文件可以问系统厂商获取,如果是原生系统可以到系统源码目录下获取。

如果报以下的错误 ,这时候就用到准备的libconscrypt_openjdk_jniso 文件

为了检测我们的应用是否已经签名成功 可以获取系统权限,看看能否获取到。

结果:

在上一种方式中,我们成功对我们的apk进行了系统签名,并且能使用系统权限,但是必须每次打包出apk再进行签名 对调试很不方便,下面我们可以生成带有系统签名的签名文件,在项目中使用,就不需要每次手动进行签名。

bubble可以替换为自己喜欢的名称,这一步要输入密码,我尝试输入其他不行,只能输入android。

bubble 可替换为自己喜欢的password和alias

到这里 两种对app进行系统签名的方式完成,如有不足,欢迎指出

通过签名可以确保数据来源的可靠性和数据的不可篡改性

对 Apk 进行签名,也就是在 Apk 中写入一个指纹,写入指纹后,Apk 中有任何修改,都会导致这个指纹无效,Android 系统在安装 Apk 进行签名校验时就会不通过,进而无法安装该 Apk

如上图:

通常的签名验签过程中,接收方收到消息后,会先向 CA 机构验证证书的合法性,再进行签名校验。但 Apk 的证书通常由开发者自己制作,没有向 CA 机构申请,Android 系统在安装 Apk 时也并没有校验证书本身的合法性,只是从证书中提取公钥和加密算法,因此,如果对第三方 Apk 重新签名,也能安装到没有安装过这个 Apk 的系统中

keystore 文件包含私钥、公钥和数字证书,分为很多种,Android 使用的是 Java 标准 keystore 格式 JKS(Java Key Storage)

Android App Bundle:用于通过 Google Play 发布的应用,需要升级到AS 32 以上版本才支持App Bundle 格式;

APK:用于创建可部署到设备上的签名 APK

点击 Finish 就会生成签名文件与签名后的 Apk

当我们需要升级 Apk 版本的时候,需要再次对 Apk 文件进行签名,可以通过配置 buildgradle 让其自动生成签名后的 Apk

如果你的项目是开源的,需要把你的签名信息写在 localproperties 中,然后在 gitignore 配置文件中加入 localproperties ,这样 localproperties 就不会提交到开源项目中,签名信息也就不会被人获取

localproperties:

app/buildgradle:

有时候我们的 apk 中某些功能需要系统签名,例如静默安装。测试系统签名的 apk,需要 root 权限,而带 Google APIs 的模拟器不能 root,因此要注意不能选择带 Google APIs 的模拟器

下面执行的 *** 作都是在 Linux 中,如果 apk 是 window 中生成的,需要拷贝到 linux *** 作,再将生成的系统签名过得 apk 再拷贝到 window,比较麻烦,可以考虑后面的自动系统签名,还是需要在 linux *** 作一次,不过之后就可以只在 window *** 作了

这两个文件在目录 aosp/build/target/product/security 下,如下图

在目录 aosp/prebuilts/sdk/tools/lib 下,如下图

将前面获取的 platformpk8 、 platformx509pem 和 signapkjar 文件放到需要签名的 apk 同一个目录,执行以下命令

如果出现上面的错误:Failed to load any of the given libraries: [conscrypt_openjdk_jni-linux-x86_64, conscrypt_openjdk_jni-linux-x86_64-fedora, conscrypt_openjdk_jni]

解决方法:

到目录 aosp/prebuilts/sdk/tools/linux/lib64 下,复制 libconscrypt_openjdk_jniso 文件到需要签名 apk 的同一个目录,并将命令改为

自动进行系统签名的原理是:先生成一个 systemjks 文件,使用 keytool-importkeypair 对 systemjks 文件进行系统签名,再 buildgradle 和 localproperties 进行配置,直接使用带有系统签名的 systemjks 对 apk 进行签名,这样编译生成的apk文件就自带系统签名了

按照前面的方法,生成一个 systemjks 文件,此时是在 window 系统中 *** 作的

进入 keytool-importkeypair 目录,将 systemjks、platformpk8、platformx509pem 文件拷贝进来,拷贝之后的目录结构为

使用 linux 中修改过的带有系统签名的 systemjks 文件将 window 中最开始生成的 systemjks 覆盖掉,再像前面的自动签名部分一样,修改 buildgradle 和 localproperties 的配置,之后生成的 apk 就是系统签名过的了

测试方法是,在 AndroidManifestxml 中添加 android:sharedUserId="androiduidsystem" 后安装到 非 Google APIs 的模拟器上 , Google APIs 的模拟器不能 root,无法安装

会发现只有使用 systemjks 文件签名后才能安装,否则安装失败,会报以下的错误:

以上就是关于Android的数字签名全部的内容,包括:Android的数字签名、如何获取android 签名信息、Android apk 系统签名等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9334644.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存