美文网首页
Android中的证书和签名

Android中的证书和签名

作者: 老王的救赎 | 来源:发表于2019-05-30 10:49 被阅读0次

    一、加密算法

    对称加密:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES。

    原理:加密和解密使用的是同一个密钥,加解密双方必须使用同一个密钥才能进行正常的沟通。

    非对称加密:RSA、ECC(椭圆曲线加密算法)、Diffie-Hellman、El Gamal、DSA(数字签名用)

    原理:需要两个密钥来进行加密和解密,公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥) ,公钥加密的信息只有私钥才能解开,私钥加密的信息只有公钥才能解开。

    Hash 算法:MD2、MD4、MD5、HAVAL、SHA-1、SHA256、SHA512、RipeMD、WHIRLPOOL、SHA3、HMAC

    消息摘要算法:将长度不固定的消息(Message)作为输入参数,运行特定的Hash函数,生成固定长度的输出,这个输出就是Hash,也称为这个消息的消息摘要(Message Digest)。

    二、PKI

    可以理解为第三方认证机构,负责的事:证明书、认证机关、证书库。

    参考知乎对该机构的神解读

    三、PKCS

    PKCS(The Public-Key Cryptography Standards )是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。全称是公钥密码学标准,  目前共发布过 15 个标准,这些标准都是协议。总结一下 就是对加密算法,签名,证书协议的描述。RSA算法可以做加密、解密、签名、验证,还有RSA的密钥对存储。

    四、真实场景

    上面说的协议具体的实现就体现在OpenSSL, 以及JDK工具中的KeyTool JDK Java第三方库BouncyCastle等工具中。

    OpenSSL:SSL,Security Socket Layer,是一个安全传输协议,在Internet网上进行数据保护和身份确认。OpenSSL是一个开放源代码的实现了SSL及相关加密技术的软件包,由加拿大的Eric Yang等发起编写的。

    签名文件和证书文件是成对出现了,二者不可分离。

    可靠通信前提:首先,要确定消息的来源身份正确;其次,要保证信息在传递的过程中不被第三方篡改,即使被篡改了,也可以发觉出来。

    数字签名技术:

    消息的发送者:生成一对公私钥对,将公钥给消息的接收者。

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

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

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

    消息的接收者:收到两个部分,一是原始的消息内容,二是附加的那段数字签名

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

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

    3)比较前两步所得到的两段消息是否一致。

    上面说的技术还有个问题,就是得安全正确的预先得到公钥。数字证书主要是用来解决公钥的安全发放问题。

    内容:证书的发布机构、证书的有效期、消息发送方的公钥、证书所有者、数字签名所使用的算法、数字签名。

    数字证书也用了数字签名技术。只不过要签名的内容是消息的发送者的公钥,以及一些其它信息,确保公钥安全送达。数字证书中签名者不是随随便便一个普通的机构,而是要有一定公信力的CA机构。这些有公信力机构的根证书已经在设备出厂前预先安装到了你的设备上了。

    具体流程需要理解下面几个概念:

    证书:顾名思义就是提供了一种在Internet上验证通信实体身份的方式,数字证书不是数字身份证,由权威公正的第三方机构,即CA(例如中国各地方的CA公司)中心签发的证书, 就是可以认定是合法身份的。客户端不需要证书。 证书是用来验证服务端的。

    签名:就用私钥对一段数据进行加密,得到的密文。这一段数据在证书的应用上就是对证书原文+原文Hash进行签名。谁签的名,就是用谁的私钥进行加密。就像身份证一样, 合法的身份证我们都依据是政府签的,才不是假证, 那就是浏览器会有政府的公钥,通过校验(解密)签名,如果能够解密,就可以确定这个就是政府的签名。就对了。

    CA机构:权威证书颁发机构,浏览器存有CA的公钥,浏览器以此公钥来验证服务端证书的合法性。

    证书的获取:生成证书申请文件.csr(涉及到PKCS#10定义的规范)后向CA机构申请。 或者自己直接通过生成私钥就可以一步到位生成自签名证书。 自签名证书就是用自己的私钥来签名证书。

    那么SSL协议的具体过程就是:

    1、客户端请求建立SSL连接,将协议版本,随机数,支持的一套加密规则,压缩方法发给服务器。

    2、服务器收到客户端请求后,确定协议版本如果不一致则关闭通信。如果一致则生成随机数,确定的加密方法,返回证书给客户端。证书里面包含了网站地址,公钥,原文Hash签名以及证书的颁发机构等信息

    3、获得网站证书之后浏览器先验证证书的合法性,再生成一个随机数,然后把对称密钥(三个随机数通过一个密钥导出器生成),编码改变通知,前面发送的所有内容的Hash值 。用服务器公钥加密以上内容,发送给服务器。那个Hash值是用来服务器校验这个阶段的数据完整性。

    4、网站接收浏览器发来的数据之后 使用自己的私钥校验签名,并对原文进行Hash与解密出的Hash做比对检查完整性。然后发送编码改变通知,服务器握手结束通知(所有内容做Hash)。发送给客户端校验。

    5、客户端校验,校验成功后,之后就用对称秘钥进行通信了。

    总共的过程是C-S-C-S-C四次握手。

    五、脱离权威机构CA的证书

    CA起到一个权威中间人的角色,如果脱离了CA,那么证书还是证书,还能加密,保证数据完整性。但是无法应用在客户端去认定服务器身份合法。下面说一下脱离了权威机构的证书的应用:

    自签名证书:

    身份认证场景就变成,不再是某个官方权威说了算,而是假设第一次碰到这个证书,会认为,这个证书与之捆绑的实体之间是合法的并做记录。如果当这个实体下次捆绑了另一个证书,那么就是非法的。

    Android中的如何对App进行身份认证和不被篡改:

    Android系统在安装App时候会进行校验ApplicationId,ApplicationId不同会认定为不同应用。相同应用,第二次安装会校验证书是否和之前App的证书相同,如果相同则两个包很可能来自同一个身份。如果证书不同,也就是该包被另一个身份用自己的私钥重新签名过,就会拒绝安装。 然后通过公钥来解密签名,如果能解密,说明身份是OK的。否则拒绝安装。比对解密签名后的Hash与APK包内的cert.sf文件(该文件是APK内所有文件生成的Hash文件)是否一致,如果相同则认定为没有被篡改。

    六、总结

    1、在SSL协议下,这种场景是浏览器用于认定合法的服务器身份。在自签名证书下,需要用户选择是否信任该证书。

    2、在Android App采用自签名证书的场景下,证书起到了假设第一次的证书合法,公钥合法,后续如果证书不一致或不能够完成签名校验,就是非法。

    3、证书和非对称加密算法的关系:证书代表一个身份的主体,包含了非对称秘钥体系中的公钥,以及用私钥对证书签名。这种组织结构,把非对称加密算法从加密的功能,拓宽到了用于身份认证,信息完整性上。这体现在了证书的作用。本质还是利用了非对称加密算法的特性。

    4、SSL协议和证书的关系:因为证书解决了客户端对服务器的身份认证(自签名证书除外),同时也解决了加密,和信息完整性,所以SSL协议基于证书来实现。

    相关文章

      网友评论

          本文标题:Android中的证书和签名

          本文链接:https://www.haomeiwen.com/subject/kuzptctx.html