数字证书
目录
1.密码学相关知识
明文(plain text):发送人、接受人和任何访问消息的人都能理解的消息。
密文(cipher text):明文消息经过某种编码后,得到密文消息。
加密(encryption):将明文消息变成密文消息。
解密(decryption):将密文消息变成明文消息。
算法:取一个输入文本,产生一个输出文本。
加密算法:发送方进行加密的算法。
解密算法:接收方进行解密的算法。
**(key):只有发送方和接收方掌握的消息
对称**加密(Symmetric Key Cryptography):加密与解密使用相同**。
非对称**加密(Asymmetric Key Cryptography):加密与解密使用不同**,分为公钥和私钥
这里简单说一下对称**加密,和非对称加密
对称加密
在对称加密算法中,加密使用的**和解密使用的**是相同的,加密和解密都是使用同一个**。通信双方采用相同的**来加解密会话内容,即一段待加密内容,经过同一个**的两次对称加密后,与原来的结果一样。
举例说明:
根据异或性质:
(A ⊕ B) ⊕ B = A
得到如下加密方法,其中C为密文,P为明文,K是双方约定的常量,
C = P ⊕ K
对应的解密方法则为:
P = C ⊕ K
这就是一种简单的对称**算法的过程,其中异或操作是对称加密、解密算法,K则是**。
注:对称加密算法有一个很大的缺陷,就是通信双方如何安全的传递加***。
非对称加密
非对称加解密算法的**是成对出现的,公钥加密过的密文只有对应的私钥能解密;私钥签名过的密文可以通过对应的公钥验签。原则上私钥是不能在网络中传递的。
双方通信时,首先要将**对中的公钥传给对方,这个**可以在不安全的信道中传输;传输数据时,先使用自己持有的**做加密,对方只能用自己传输过去的**解密。
举例说明:
其中C表示密文,P表示明文,x是公钥,y是私钥,
并假设 xy= 1,则有下加解密方法
加密方法为:
解密方法为:
这里引入一个例子来介绍一下,通信双方的加密问题。
第一回合:
“小客”->“小服”:你好
“小服”->“小客”:你好,我是小服
因为消息是在网络上传输的,有人可以冒充自己是“小服”来向小客发送信息。所以会出现下面的情况:
“小客”->“黑客”:你好 // 黑客在“小客”和“小服”之间的某个路由器上截获“小客”发给小服的信息,然后自己冒充“小服”
“黑客”->“小客”:你好,我是小服
“小客”在接到消息后,并不能肯定这个消息就是由“小服”发出的,某些“黑客”也可以冒充“小服”发出这个消息。
那么如何确定信息是由“小服”发过来的呢?
第二回合:
“小客”->“小服”:你好
“小服”->“小客”:你好,我是小服
“小客”->“小服”:向我证明你就是小服
“小服”->“小客”:你好,我是小服 {你好,我是小服}[私钥|RSA]
//{你好,我是小服}[私钥|RSA] 表示用私钥对“你好,我是小服”进行加密后的结果。
为了向“小客”证明自己是“小服”,“小服”把一个字符串用自己的私钥加密,然后发送明文+加密后的密文一起发给“小客”。
“小客”收到信息后,用自己持有的公钥把 {你好,我是小服}[私钥|RSA] 这个内容用公钥进行解密,然后将解密的内容和“你好,我是小服”对比。
因为“小服”用私钥加密后的内容,只能由公钥进行解密,私钥只有“小服”持有,所以如果解密出来的内容是能够对得上的,那说明信息一定是从“小服”发过来的。
注:RSA密码体制是一种公钥密码体制,公钥公开,私钥保密,它的加密解密算法是公开的。 由公钥加密的内容可以并且只能由私钥进行解密,由私钥加密的内容可以并且只能由公钥进行解密。
第三回合
“小客”->“小服”:你好
“小服”->“小客”:你好,我是小服
“小客”->“小服”:向我证明你就是小服
“小服”->“小客”:你好,我是小服 {你好,我是小服}[私钥|RSA]
“小客”->“小服”:{我的帐号是aaa,密码是123,把我的余额的信息发给我看看}[公钥|RSA]
“小服”->“小客”:{你的余额是100元}[私钥|RSA]
注意上面的的信息 {你的余额是100元}[私钥|RSA],这个是“小服”用私钥加密后的内容。
我们之前说了,公钥是发布出去的,因此所有的人都知道公钥。所以除了“小客”,其它的人也可以用公钥对{你的余额是100元}[私钥|RSA]进行解密。因此这个信息是无法保密的;
在实际的应用过程,一般是通过引入对称加密来解决这个问题,看下面的演示:
第四回合
“小客”->“小服”:你好
“小服”->“小客”:你好,我是小服
“小客”->“小服”:向我证明你就是小服
“小服”->“小客”:你好,我是小服 {你好,我是小服}[私钥|RSA]
“小客”->“小服”:{我们后面的通信过程,用对称加密来进行,这里是对称加密算法和**}[公钥|RSA] //红色字体的部分是对称加密的算法和**的具体内容,小客把它们发送给小服。
“小服”->“小客”:{OK,收到!}[**|对称加密算法]
“小客”->“小服”:{我的帐号是aaa,密码是123,把我的余额的信息发给我看看}[**|对称加密算法]
“小服”->“小客”:{你的余额是100元}[**|对称加密算法]
“小客”在确认了“小服”的身份后,“小客”自己选择一个对称加密算法和一个**,把这个对称加密算法和**一起用公钥加密后发送给“小服”。
对称加密算法和**是用公钥加密的,因此就算这个加密后的内容被“黑客”截获了,由于没有私钥,“黑客”也无从知道对称加密算法和**的内容,这样可以保证只有小服可以知道对称加密算法和**。“小服”和“小客”就可以用对称加密算法和**来加密通信的内容了。
那么问题来了“小服”要对外发布公钥,那“小服”如何把公钥发送给“小客”呢?我们可能会想到以下两个方法:
- 把公钥放到互联网的某个地方的一个下载地址,事先给“小客”去下载
- 每次和“小客”开始通信时,“小服”把公钥发给“小客”
但是这个两个方法都有一定的问题:
对于方法1,“小客”无法确定这个下载地址是不是“小服”发布的;另外要所有的“小客”都在通信前事先去下载公钥也很不现实。
对于方法2,也有问题,因为任何人都可以自己生成一对公钥和私钥,他只要向“小客”发送他自己的公钥就可以冒充“小服”了。
我们的数字证书就可以解决这个问题,它可以证明小服的公钥确实是小服的。
2.数字证书
数字证书(”digital certificate”或“public key certificate”)是指在互联网通讯中标志通讯各方身份信息的一个数字认证,在网上用它来识别对方的身份。从本质上来说是一种电子文档,它的作用是证明某某东西确实是某某东西。
CA( Certificate Authority )也叫“证书授权中心”。负责发放和管理数字证书的权威机构。一般来说,CA必须是所有行业和所有公众都信任的、认可的,因此它必须具有足够的权威性。
一般分为:
- 根CA:处在信任链的顶端,其证书公钥默认导入各种操作系统与浏览器中
- 中级CA:处于信任链中间,根CA或其他中级CA颁发的证书,还能继续颁发子证书
- 个人:处在信任链末端,中级CA或根CA颁发的证书
分类
按持有者分类 :
个人证书:CA中心给个人颁发的证书,仅代表个人身份,证书包含个人信息和个人公钥。
单位证书:CA中心给组织机构颁发的证书,代表机构的身份,包含机构单位的信息和单位公钥。
系统证书:CA中心给应用系统或者设备颁发的证书,代表系统的身份,包含系统的信息和系统的公钥。
按证书用途分类:
签名证书:签名证书只能用于签名和验证签名,为了**的安全,**对一般在小客端产生和保存。
加密证书:加密证书只能用于加密,其中**对由CA产生,通过保护算法和协议发送给用户保存,同时CA中心也保存该**对,以备管理和恢复。
格式
证书有PEM和DER编码格式,其中PEM是采用Base64编码字符保存,DER格式采用二进制保存。
一张证书包含公钥与私钥,对应着非对称加密算法中用到的公私钥。通常用.crt后缀标识公钥,用.key标识私钥。
还有一种将公钥与私钥捆绑在一起的保存方法,后缀通常为.pfx(微软用)或者.p12。
内容
证书公钥中除了保存公钥内容以外,通常还有颁发者、使用者、有效期、签名等信息。
证书私钥中有公私钥信息,全部的RSA算法参数。
注:数字证书可以保证数字证书里的公钥确实是这个证书的所有者(Subject)的,或者证书可以用来确认对方的身份。也就是说,我们拿到一个数字证书,我们可以判断出这个数字证书到底是谁的。
信任链
证书之间的信任关系,是可以嵌套的。比如,C 信任 A1,A1 信任 A2,A2 信任 A3......这个叫做证书的信任链。只要你信任链上的头一个证书,那后续的证书,都是可以信任的。
吊销列表
如果证书持有者一个不小心,将证书私钥给泄露了,这个时候他人就可以冒用其身份。为了防止这种情况发生,各大CA都维护着一张CRL列表,里面标记了虽然还未过有效期,但已不能再使用的证书。
数字证书的工作原理
“小服”在给“小客”发公钥的过程中,会把公钥以及小服的个人信息通过Hash算法生成消息摘要;
为了防止摘要被人调换, “小服”还会用CA提供的私钥对消息摘要进行加密来形成数字签名;
并且,最后还会把原来没Hash算法之前的信息和数字签名合并在一起,形成数字证书。
当“小客”拿到这份数字证书之后,就会用CA提供的公钥来对数字证书里面的数字签名进行解密得到消息摘要,然后对数字证书里面“小服” 的公钥和个人信息进行Hash得到另一份消息摘要,然后把两份消息摘要进行对比,如果一样,则证明这些东西确实是“小服” 的,否则就不是。
第五回合(完整过程)
上接第四回合场景,这里就用证书来代替公钥
1、“客户”->“服务器”:你好
2、“服务器”->“客户”:你好,我是服务器,这里是我的数字证书 //这里用证书代替了公钥
3、“客户”->“服务器”:向我证明你就是服务器+一段随机数 //这里小客发送消息时一般会带上一段随机数,用来验证身份
4、“服务器”->“客户”:{一个随机字符串}[私钥|RSA]
“客户”收到“服务器”的证书后,它会去验证这个数字证书到底是不是“服务器”的,数字证书有没有问题,数字证书如果检查没有问题,就说明数字证书中的公钥确实是“服务器”的。检查数字证书后,“客户”会发送一个随机的字符串给“服务器”让它用私钥去加密,服务器把加密的结果返回给“客户”,“客户”用公钥解密这个返回结果,如果解密结果与之前生成的随机字符串一致,那说明对方确实是私钥的持有者,或者说对方确实是“服务器”。
验证“服务器”的身份后,“客户”生成一个对称加密算法和**,用于后面的通信的加密和解密。这个对称加密算法和**,“客户”会用公钥加密后发送给“服务器”,别人截获了也没用,因为只有“服务器”手中有可以解密的私钥。这样,后面“服务器”和“客户”就都可以用对称加密算法来加密和解密通信内容了。
5、“服务器”->“客户”:{OK,已经收到你发来的对称加密算法和**!有什么可以帮到你的?}[**|对称加密算法]
6、“客户”->“服务器”:{我的帐号是aaa,密码是123,把我的余额的信息发给我看看}[**|对称加密算法]
7、“服务器”->“客户”:{你好,你的余额是100元}[**|对称加密算法]