证书的颁发者和被颁发者都是自己,实际上是用证书里公钥字段的值对应的私钥来进行签名的,也就是将证书内容进行HASH后拿证书拥有者的私钥进行加密(签名的过程)。
对于系统而言,要鉴别是否可信任,首先需要有签名和证书。然后往上回溯,直到根证书,如果是在系统信任列表里的,那就是可信任的。
人为的把一些操作归类,当用户调使用的应用调用这些操作的API时,系统表现得不一样。比如不可信任的应用,当调用短信功能时,发短信之前系统会弹窗让用户确认是否确定要发送消息,用户体验会很差。
比如Android平台中,可以在AndroidManifest文件中对权限进行申请:
<uses-permission android:name="android.permission.INTERNET" />
是否被批准由平台决策来决定。例如以上的网络请求权限肯定会被批准,只要用户安装应用的时候接受了,应用就能正常访问网络。
但是例如Reset(重启手机)这种权限,平台不会批准,只会批给原生的一些应用。
应用在签名的时候是把AndroidManifest文件、src文件全部作为一个整体进行签名的,所以一旦签名后再去修改权限申请,和公钥解密后的内容是对不上的。
一些特权权限,必须要用系统的私钥去签名才能在安装的时候通过,所以只有系统内置的应用才能使用特权权限,而我们普通开发的应用因为没有系统的私钥,只有自己的私钥,当然也不能通过了。
Android是自签名的,也就是证书是自己颁发给自己的,并不是受信任CA颁发的,没有办法确定证书的可信任性。
主要是做完整性的鉴别,防止内容被篡改。
因为并没有可信任的模式,所以在安装和运行时无法对是否可信任做限制。
仅仅是在安装的时候对签名进行验证。运行时不会再验证签名!
同一个开发商开发的多个应用,为了方便相互数据访问,设置同一个sharedUserId。
升级应用,新的应用必须和老的应用id一样,也就是包名一样,同时证书也要一样。
apk文件实际上就是压缩包,用普通解压软件解压以后得到如下界面:
打开META-INF文件夹,里面有3个文件:
前面解压apk的时候有个res目录,这里把res目录下的所有资源文件都进行了SHA1的计算得到HASH值,即SHA1-Digest
第二行的SHA1-Digest-Manifest: i19xvR6tIRLRWIV4cZGWDvQvvNE= ,其实是对MANIFEST的内容进行是SHA1计算所得到的HASH值。
下面是对MANIFEST中每一项,即Name:后面的内容+SHA1-Digest:后面的内容,整体进行SHA1计算又得到了很多个HASH值。
这里的内容既包括证书内容也包括签名。
首先对CERT.SF里的所有内容进行SHA1计算得到HASH值,再把这个HASH值用私钥进行RSA加密得到签名。
申请的权限一般与某个操作关联。
必须在Androidmanifest文件中申请权限。
用户可以在应用管理里查看应用所申请的权限,不可控是指用户在安装应用的时候要么全盘接受权限,只要有一个不接受就安装不了。
用系统的私钥来签名,从而对特权权限的单独控制。
android :protectionlevel=“ ”;
Normal是常规的,Dangerous是敏感的,在安装应用的时候会提示。
Signature:当应用是第三方应用时,必须要是应用开发者的私钥签名才能申请使用;当应用是系统内置应用时,必须是系统平台的私钥签名才能申请使用。
SignatureOrSystem:满足Signature或者系统级别的。