前言
虽然我们都知道Android应用发布前要签名,但是至于签名的用处以及原理却知之甚少,所以,我们今天进来解决一下这个疑惑,即为什么要签名,以及签名到底是怎么回事。
为什么要签名
首先我们要明确一点,Android系统是不允许安装没有签名过的应用程序的,即使是debug模式的APK也是如此。之所以我们在开发中不用去签名应用,是因为AS已经在编译打包的使用使用默认的签名对APK进行了签名操作。那么,Google为什么要这么设计呢?其实我觉得很简单,为了维护Android应用生态圈的稳定。试想,如果没有签名,是不是我就可以反编译一下某个APK然后修改一下它的内容,再重新发布一下就变成了一个全新的应用了呢。甚至我可以去做一个钓鱼应用,这样,Android应用的生态圈必然会混乱不堪。通过签名去校验应用的开发者,这就是Android APK为什么一定要签名的原因。至于签名怎么完成这一工作,看完后面内容就可以知晓。
签名还会带来其他一些好处:
- 应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序。如果想升级应用程序,签名证书要相同,包名称要相同!
2.应用程序模块化:Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块
3.代码或者数据共享:Android提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了。
不同的应用程序之间,想共享数据,或者共享代码,那么要让他们运行在同一个进程中,而且要让他们用相同的证书签名。
签名是怎么一回事
签名的目的
上面我们已经讲到,签名就是要保证应用的身份不被替换,不会被轻易的伪造。基于这一点,我们看下签名是怎么来实现这个一目的的。
基础知识
首先讲几个基础知识:
- 数据摘要
通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。常见的算法有MD5(128bit),SHA-1(160bit)等。
举个例子:
MD5("123456789") = 0x10...10;
0x10...10
就是字符串“123456789”的数据摘要。而MD5算法的工作就是讲输入的任意数据经过一系列的运算后得到一个128位的二进制数据,这个数据是不可逆的,也就是说我们无法通过运算结果解密出原始数据,也就是我们通过所说的Hash算法。
这类算法的特点可以概括一下几个特点:
消息摘要的主要特点有:
1)无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如应用MD5算法摘要的消息有128个比特位,用SHA-1算法摘要的消息最终有160比特位的输出。
2)一般来说(不考虑碰撞的情况下),只要输入的原始数据不同,对其进行摘要以后产生的消息摘要也必不相同,即使原始数据稍有改变,输出的消息摘要便完全不同。但是,相同的输入必会产生相同的输出。
3)具有不可逆性,即只能进行正向的信息摘要,而无法从摘要中恢复出任何的原始消息。
- 对称加密与非对称加密
对称密钥加密(英语:Symmetric-key algorithm)又称为对称加密、私钥加密、共享密钥加密,是密码学中的一类加密算法。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。实务上,这组密钥成为在两个或多个成员间的共同秘密,以便维持专属的通讯联系。与公开密钥加密相比,要求双方取得相同的密钥是对称密钥加密的主要缺点之一
公开密钥加密(英语:public-key cryptography,又译为公开密钥加密),也称为非对称加密(asymmetric cryptography),一种密码学算法类型,在这种密码学方法中,需要一对密钥(其实这里密钥说法不好,就是“钥”),一个是私人密钥,另一个则是公开密钥。这两个密钥是数学相关,用某用户密钥加密后所得的信息,只能用该用户的解密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。称公开的密钥为公钥;不公开的密钥为私钥。
- 数字签名与数字证书
这里有发现一篇通俗易懂的文章
APK签名
有了这些知识,我们就可以来聊一下APK的签名了。
apk -> 数据摘要 -> 数字签名
android -> 解密出数据摘要 -> 校验数据摘要