从一个经典的例子说起:Bob和他的朋友们经常通过写信的方式交流,Bob不希望除了朋友以外的人可以获取信件的内容,决定采用将信件加密的方式,保证信息安全。
在信息传输中,为了防止被第三方截获并获取信息,将传输的明文通过秘钥和一定算法转换为密文,这个过程即为加密;使用对应的算法和秘钥将密文还原为明文即为解密。加解密过程中的算法是公开的,但秘钥是保密的。一般来讲,只要保证秘钥不泄漏,通信可以保证通信安全。
通过加解密是否使用同一个秘钥将加密分为:对称加密和非对称加密。
Bob准备了一个秘钥,并将它分发给了每一个朋友。Bob每次发出信件时会通过加密算法和秘钥对信件内容加密,当朋友们收到信件后,使用约定的解密算法和秘钥恢复信件为明文。朋友们回信时,同样使用秘钥和加密算法对信件加密,Bob收信后解密,从而完成通信过程加密。这个过程就是对称加密。
对称加密是指加密和解密使用同一个秘钥进行。常用的对称加密算法有DES、3DES(TripleDES)和AES
Bob和他的朋友们使用对称加密的方式通信,遇到一些问题:
- 必须提前将秘钥分发给朋友们,分发过程中可能被截获
- 如果朋友A的信件被朋友B不小心拿到,朋友B可以识别信件中的内容
对此,Bob决定做以下改进:
- 每人都准备两个秘钥,即公钥和私钥,将公钥分发给朋友,私钥则自己保存
- 想要给谁写信则使用谁的公钥对信件进行加密,收到信件的人使用自己的私钥解密
这个过程就是非对称加密。
非对称加密中加密和解密使用不同的秘钥,即公钥和私钥。一般将公钥发送给其他用户使用,私钥则仅服务自身使用,换言之公钥可以是公开的,私钥是绝对保密的。使用公钥加密只能使用私钥解密,使用私钥加密只能使用公钥解密。当下最常见最流行的非对称加密为RSA
实际使用中往往是对称加密和非对称加密混合使用
Bob计划给朋友们写一封信,想保证朋友们拿到信件后可以确定信件未被篡改过。于是将信的内容经过MD5运算后得到一个固定长度的字符串附在信件后面,这个字符串就是信件的摘要。朋友收到信后使用同样的算法生成摘要,进行比对,即可确认信件是否被修改过。
摘要算法(Digest):即常说的散列函数、哈希函数,对任意一组输入数据进行计算,得到一个固定长度的输出摘要。常见的摘要算法有:MD5、SHA1、SHA2(SHA224、SHA256、SHA384)
摘要算法一般有以下特性:
- 不可逆:只有算法,没有秘钥,只能加密,不能解密
- 难题友好性:想要破解只能暴力枚举
- 发散性:只要原文有一点点改动,摘要就要发生剧烈变化,即:雪崩效应
- 抗碰撞性:原文不同,计算后摘要也要不同
常见的摘要算法有:MD5、SHA1、SHA2(SHA224、SHA256、SHA384),实践证明:MD5和SHA1的抗碰撞性不佳,SHA2是当前最主流的摘要算法
上文描述的摘要过程有一个严重的漏洞:如果黑客劫持了Bob的信件,修改后生成新的摘要,附在信件后面,朋友收到后则无法判断信件是否被修改过。我们可以对摘要进行加密来解决这个问题,具体如何操作?
上文中,Bob和他的朋友们使用非对称加密通信时,我们发现通信过程中总是使用公钥加密,私钥解密。从非对称加密的概念中我们得知,私钥加密、公钥解密也是可行的。如果Bob写了一封信使用自己的私钥加密,发送给朋友A,朋友A使用Bob的公钥可以正常解密内容,但是如果朋友B也拿到信件,其仍然可以解密内容,此时唯一能确定的是:信件一定是Bob发出的。也就是说:使用私钥加密,公钥解密起到的作用是:身份认证。
因此,我们可以将Bob的私钥对其信件摘要加密,并附在信件末尾,此即为数字签名。朋友收到后,使用Bob的公钥解密得到原文摘要,在与原文生成摘要对比,即可确定信件是否被篡改。这个过程也叫作验签。
非对称加密中总是需要先发送公钥,直接发送公钥的发送有一定风险。如:Joe将自己的公钥发送给Bob的朋友们,并谎称这是Bob的公钥,Joe就可以伪装成Bob与他的朋友们进行通信。即存在公钥信任问题:如何保证这个公钥一定是Bob的呢?
为了保证公钥的可靠性,引入了数字证书,数字证书包含一个主体及其公钥等信息,由特定的CA机构颁发给这个主体,CA机构具有极高的可信度。使用数字证书的一般过程如下:
- Bob向CA机构申请证书,CA机构将Bob的公钥等信息进行摘要运算,得到证书的摘要;
- CA用自己的私钥将摘要进行签名算法,生成证书的数字签名,也就是证书指纹;
- 一起发布证书信息和证书数字签名,Bob得到数字证书;
- Bob给朋友写信时,在信件中附上信件数字签名和申请的数字证书,一起发送给朋友;
- 朋友收到信件后,先证书验签:取出数字证书,对证书验签,获取可信的Bob公钥(数字证书的验签过程:一般操作系统存储有可靠的CA机构公钥,其余验签过程同上文验签);
- 证书验签完成后,进行信件验签,使用Bob的公钥和信件的数字签名进行验签。
数字证书常见内容:
- 所有者:Bob
- 公钥:Bob的公钥
- 颁发者:CA
- 有效期:
- 签名哈希算法:指定的摘要算法,用来计算证书的摘要
- 签名算法:用于生成签名
- 指纹(数字签名):证书的摘要,保证完整性
- 序列号:唯一标识