什么是加密
简单来说分为两种,对称加密和非对称加密。
对称加密
加密和解密用的是同一个秘钥,在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA等。这类加密算法的优点就是计算量小、加密速度快、加密效率高;但是缺点也很明显,在传输数据前,双方必须商定并保存好秘钥,任何一方的秘钥被泄露,加密信息就不再安全了。另外,每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。
非对称加密
非对称加密需要两个秘钥来进行加密和解密,这两个秘钥非别是公有秘钥(公钥)和私有秘钥(私钥),公钥与私钥是一对,如果用公钥对数据进行加密,那么就必须用对应的私钥才能解密;同理,如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。在非对称加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。
公钥和私钥
公钥和私钥是非对称密码学中的概念。他们的特点是用公钥加密的密文只能用私钥解密,用私钥加密的密文只能用公钥解密。在通信过程中,私钥由服务器持有,不可外泄,公钥则通过HTTP发送给客户端。服务器发送经过私钥加密的密文给客户端,客户端可以通过公钥解开密文;客户端发送经过公钥加密的密文给服务器,服务器通过私钥解开密文。这个过程如图所示
简易版理解
一、公钥加密
假设一下,我找了两个数字,一个是1,一个是2。我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥。
我有一个文件,不能让别人看,我就用1加密了。别人找到了这个文件,但是他不知道2就是解密的私钥啊,所以他解不开,只有我可以用
数字2,就是我的私钥,来解密。这样我就可以保护数据了。
我的好朋友x用我的公钥1加密了字符a,加密后成了b,放在网上。别人偷到了这个文件,但是别人解不开,因为别人不知道2就是我的私钥,
只有我才能解密,解密后就得到a。这样,我们就可以传送加密的数据了。
二、私钥签名
如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道2是我的私钥),结果所有的人都看到我的内容了,因为他们都知
道我的公钥是1,那么这种加密有什么用处呢?
但是我的好朋友x说有人冒充我给他发信。怎么办呢?我把我要发的信,内容是c,用我的私钥2,加密,加密后的内容是d,发给x,再告诉他
解密看是不是c。他用我的公钥1解密,发现果然是c。
这个时候,他会想到,能够用我的公钥解密的数据,必然是用我的私钥加的密。只有我知道我得私钥,因此他就可以确认确实是我发的东西。
这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。用私钥来加密数据,用途就是数字签名。
三、举例
比如有两个用户Alice和Bob,Alice想把一段明文通过双钥加密的技术发送给Bob,Bob有一对公钥和私钥,那么加密解密的过程如下:
1.Bob将他的公开密钥传送给Alice。
2.Alice用Bob的公开密钥加密她的消息,然后传送给Bob。
3.Bob用他的私人密钥解密Alice的消息。
公钥和私钥是成对的,它们互相解密。
公钥加密,私钥解密。
私钥数字签名,公钥验证。
优缺点
非对称加密的优点:
非对称加密采用公有密匙和私有密匙的方式,解决了http中消息保密性问题,而且使得私有密匙泄露的风险降低。
因为公匙加密的消息只有对应的私匙才能解开,所以较大程度上保证了消息的来源性以及消息的准确性和完整性。
非对称加密的缺点:
非对称加密时需要使用到接收方的公匙对消息进行加密,但是公匙不是保密的,任何人都可以拿到,中间人也可以。那么中间人可以做两件事,第一件是中间人可以在客户端与服务器交换公匙的时候,将客户端的公匙替换成自己的。这样服务器拿到的公匙将不是客户端的,而是中间人的。服务器也无法判断公匙来源的正确性。第二件是中间人可以不替换公匙,但是他可以截获客户端发来的消息,然后篡改,然后用服务器的公匙加密再发往服务器,服务器将收到错误的消息。
中间商可以冒充服务器篡改公钥,如下图↓
为了防止中间商篡改公钥,需要用到数字证书,在讲数字证书之前还需要先了解一下数字签名
数字签名
数字签名是个什么东西呢?它是信息的指纹。但是这不是重点,重点是数字签名的生成过程。数字签名的生成有两个步骤:
对明文进行哈希,得到一串哈希值;
对第一步得到的哈希值用私钥加密。
数字签名是如何使用的呢?其实看一张图就明白了。数字签名会随着内容一起被发送出去,接收方首先用公钥解密数字签名得到哈希值h1
,然后对内容用同样的算法计算哈希值h2
,如果h1=h2
,那么说明内容没有被串改过。
然而这个过程也存在风险,如果中间商篡改了公钥,那么他就可以伪造数字签名,一样完蛋。如下
所以引入数字证书
数字证书
数字证书包含两部分内容:
- 服务器信息
- 数字签名
这里的服务器信息中就包含了服务器的公钥,当然还有一些其他信息,比如证书名称、发布机构、有限期、哈希算法等。数字签名就是对服务器信息进行哈希,然后用CA认证中心的私钥加密的结果。
这里特别强调数字签名是用CA认证中心的私钥加密的,因为这样才能防止中间商串改公钥。这里还有一点需要注意,那就是操作系统会自动安装CA认证中心的公钥,所以,每个客户端都默认有CA认证中心的公钥。
如果中间商想伪造数字证书,篡改数字证书中的公钥,由于中间商没有CA认证中心的私钥,无法伪造数字签名,于是也就无法伪造数字证书了。
但是这样就万无一失了吗?并不是,如果中间商也在CA认证中心注册了数字证书,并且用这个合法的数字证书替换了服务器的数字证书,还是会完蛋。但这就不是我们该操心的问题了,这是CA认证中心该考虑的问题,应该给什么人发证书,拒绝给什么人发证书。只有CA认证中心能够区分好人和坏人,我们才是安全的。
其实到最后就是客户端把对服务器的信任委托给了CA认证中心,因为服务器是不一定可信的,那就创造一个相对一定可信的第三方。
PS:真正的HTTPS通信并不是通过公钥和私钥加密的,公钥和私钥只用在握手过程中,当客户端请求到真正的公钥后,会生成一个随机数(对称密钥)并用公钥加密,发送给服务器,后续的通信就用对称密钥加密了。这样做的原因是非对称加密的性能相对对称加密来说会慢上几倍甚至几百倍,比较消耗系统资源。正是因为如此,https将两种加密结合了起来。详见HTTP和HTTPS