公钥、私钥、数字证书和Android签名

公钥和私钥

一、传统加密的痛点
说起公钥和私钥,就要从信息加密的痛点说起。

小明给jack发消息,为了防止被别人窃听、篡改,需要对内容加密。所以他们两约定了一种加密算法X,小明通过加密算法X对消息加密,jack收到消息后通过加密算法X对内容解密。

问题又来了,这种情况需要小明提前把加密算法X发给jack,加密算法有可能被窃听,这样黑客还是能对消息进行窃听、篡改。

二、公钥、私钥的特点
后来就有人发明了公钥、私钥来解决这个问题,公钥、私钥具有如下特点:

  • 公钥、私钥是成对出现的,每个人都拥有一对公、私钥;
  • 使用公钥加密的内容,只有其对应的私钥才能解密。使用私钥加密的内容,只有其对应的公钥才能解密;
  • 私钥自己保存,绝不能告诉任何人。公钥是公开给别人(你的消息接受者)使用的;

从上述特点大致可以看出,使用接收方的公钥加密消息,只有接收方的私钥才能解密,而私钥是不会公开的,所以黑客没有机会窃听了。

三、公、私钥是如何解决上面的两个问题的
那么再回到刚才的痛点,通过下面的方法就能解决:

  • jack把自己的公钥发送给小明、小明把自己的公钥发送给jack。这个过程被黑客截取到了也没关系;
  • 小明提取出消息正文的MD5码,然后使用自己的私钥加密MD5码,得到文件称为数字签名。签名是什么意思?因为这个文件是小明的私钥加密的,只有小明的公钥才能解密,反过来说,如果使用小明的公钥解密出来了,就说明这个文件一定是小明的私钥加密的,就证明了消息的发送者是小明;
  • 小明通过jack的公钥对消息正文加密,得到加密消息;
  • 小明把数字签名、加密消息一起发送给jack;

jack接收到消息后需要判断两点:消息是否正确完整、消息是否是小明发送的。

jack使用小明的公钥解密数字签名,得到MD5码,如果能正确解密就说明发送人是小明。然后再用自己的私钥对加密消息进行解密,并提取出消息正文的MD5码,和上一步得到的MD5码对比,如果一致,就说明消息是正确完整的。

整个过程,黑客只有两个人的公钥,只能解析出数字签名解析出MD5码,真正的内容无法解密。如果对消息内容进行损坏,jack也能发现。

数字证书

其实上面的过程还是有一个漏洞:小明把公钥发送给jack的时候,黑客可以截取公钥,然后把黑客自己的公钥发送给jack,这样就会导致小明、jack永远在跟中间人通信。

所以这里就涉及到一个问题:公钥如何准确无误地发放?

这里就要引入权威的证书授权机构——CA,小明去CA机构申请证书,将小明的个人信息、公钥生成一个证书,然后把这个证书发送给jack,jack拿这个证书去证书授权机构查询,如果能匹配上小明的信息,就说明这个证书是小明的,就可以使用证书中的公钥来解密小明的消息。

通过公钥、私钥和数字证书,就形成了一套完美的消息加密机制。

Android签名

Android签名主要有两种方式,一种是通过keystore,一种是通过.pk8和x509.pem,这两种方式是可以转换的,总之最终的目的就是通过私钥和公钥对apk进行签名。注意,它叫“签名”,不叫“加密”,至于为什么,后面会讲到。

下面先简单介绍下两种签名方式。

一、通过keystore签名
第一步,使用keytool生成keysotre文件。keystore文件中包含了我们的私钥和公钥。
这里写图片描述
superwk是别名,36500天是使用时间,F:\SingnTest\wk.keystore是最终文件

第二步,使用刚才生成的keystore文件对app进行签名。
这里写图片描述
上面的4个参数分别是:keystore文件、签名完成后的apk、待签名的apk、kestore的别名

二、通过.pk8和x509.pem签名
第一步,获取.pk8和x509.pem文件。可以通过keystore文件转换得到,具体可以百度。

第二步,使用signapk.jar工具进行签名:
这里写图片描述
可以看出,使用keystore签名时,需要输入私人密码、别名,一般是自己进行签名时才会使用这种方法。如果有需要让别人签名,就不适合用keystore了(需要告诉别人密码),这时可以生成pk8和x509.pem文件发给他进行签名。

Android签名的意义

结合上面消息加密的例子,Android签名中,开发者小刚就是发送方,apk就是消息,keystore就是发送者的私钥、公钥,我们的apk是发送给Android手机(Android系统)进行安装,所以Android安装系统就是接收方。

Android系统收到apk后会做两件事:

  • 通过公钥解密文件,判断apk内容有没有被更改;
  • 比对新apk和旧版本apk的签名文件(公钥),判断是否是同一个开发者;

通过这两步,就能保证apk升级版本时,不会被黑客修改内容,也不会被恶意程序覆盖安装。

但是这个过程有两个小问题:

  • 开发者小刚没有Android系统的公钥对内容进行加密,无法防止第三方窃听消息内容,所以需要对app进行加固、代码混淆;
  • 开发者小刚没有在权威授权机构申请证书,Android系统无法判断发送者是否是开发者小刚,只能判断新旧apk是否是同一个开发者。不过,Android签名的目的只是防止被恶意覆盖,并没有说要保证开发者是否是某个固定的人或公司。
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值