Android签名文件jks中的sha1值是怎么来的

Posted 冷不冷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android签名文件jks中的sha1值是怎么来的相关的知识,希望对你有一定的参考价值。

前言

前段时间对android签名部分知识进行了学习整理,对这方面的知识有了一定了解.看了很多篇文章,不过关于jks文件中sha1值是如何来的,并没有找到答案,于是研究探索了一下,做一下分享(其实挺简单,不过没找到关于这块的文章,于是自己去研究了下,实践是探索真理的唯一标准嘛,✧(≖ ◡ ≖✿)).


基础知识

在解释sha1值如何来的之前,先介绍几个基础知识点,方便理解.

1) 数据摘要

关于数据摘要,很多文章都有介绍,详细具体的解释请自行度娘,这里简单介绍下概念,方便对文章的理解.
消息摘要算法是一种能产生特殊输出格式的算法,其原理是根据一定的运算规则对原始数据进行某种形式的信息提取,被提取出的信息就被称作原始数据的消息摘要。
著名的摘要算法有RSA公司的MD5算法和SHA-1算法及其大量的变体。
消息摘要的主要特点有:
1)无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如应用MD5算法摘要的消息有128个比特位,用SHA-1算法摘要的消息最终有160比特位的输出。(换算为16进制,长度/4)
2)一般来说(不考虑碰撞的情况下),只要输入的原始数据不同,对其进行摘要以后产生的消息摘要也必不相同,即使原始数据稍有改变,输出的消息摘要便完全不同。但是,相同的输入必会产生相同的输出。
3)具有不可逆性,即只能进行正向的信息摘要,而无法从摘要中恢复出任何的原始消息

2) jks文件

当应用发布上线的时候,需要使用jks文件对其签名,这样做可以防止应用被恶意篡改替换,同样也是开发者身份的标识,大大加强应用的安全性.创建jks文件时(很多种方法,比如使用指令,或者在studio中创建,这里不再多说)会隐式的创建密匙库(公匙和私匙)、证书等内容.这些内容会用于之后的签名校验中(应用安装时).


研究探索

日常开发中经常会使用到地图,分享,支付等的第三方框架,申请时往往需要填入应用的sha1值,正式发包时使用的是jks文件中的sha1值,本地测试时使用的是本地的debug.jks中的sha1值.通过指令查看sha1值,进入jks文件目录,打开终端,执行:

keytool -v -list -keystore xx.jks

输入密码后,可以看到如下图

这里得到了jks文件中的SHA1值,这个值就是申请时需要填入各个第三方平台的正式包的值SHA1值,那这么值是怎么来的呢,看一下框选的左上角,证书指纹(数据摘要也可叫做数据指纹),看到这个名字大概可以猜测一下,这个SHA1值其实是证书的数据摘要,那么这个证书在哪呢?刚才其实已经解释过,创建jks时会隐式的创建证书.试一下,通过指令提取出jks文件中的证书文件:
进入jks文件目录,打开终端,执行

keytool -export -alias xx -file xx.crt -keystore xx.jks

其中-alias后边的值为jks文件的别名(创建时有填) .xx.crt是生成的证书名字.
执行后会得到一个证书文件,如下图:

再对证书文件进行摘要,使用sha1算法,执行指令如下(方法很多,这里使用mac中的openssl指令):
进入证书文件目录,打开终端,执行

openssl dgst -sha1 xx.crt

执行后可以看到如图的内容:

可以看到证书文件的数据摘要-SHA1的值和jks文件中SHA1的值是相同的(忽略大小写).这样也就找到了jks文件中的sha1值的来源.


参考

Android签名机制之—签名过程详解

以上是关于Android签名文件jks中的sha1值是怎么来的的主要内容,如果未能解决你的问题,请参考以下文章

如何查看签名后的jks信息中的SHA1多少

[Android] keytools生成jsk文件以及获取sha1码

Android生成签名以及获取SHA1、MD5值

获取Android应用签名

Android | 安全码SHA1

android的签名