以为http的数据都是以明文传送,会有很大的安全问题,所以出现的https协议。https就是在http协议的基础上增加了一个安全层,可以对数据进行加密和解密(例如SSL、TLS等)。
https加密解密的原理:证书+非对称加密+对称加密
在讲解原理前先认识几个简单的加密方式:
对称加密
服务器和客户端都使用相同的钥匙对数据作处理。
单单使用这样的加密方式安全性并不高,hanker劫取客户端的钥匙,再把钥匙发给服务端,那么后续的数据对hanker都是可见的。
非对称加密
服务端会有两个钥匙,私钥和公钥。私钥加密后只能公钥解密,公钥加密后只能私钥解密。
非对称加密可以保证客户端到服务端的数据安全,但是服务端到客户端并不安全,公钥可以被多个客户端拥有。
对称+非对称加密
客户端获取服务端公钥后,用公钥将对称加密的钥匙进行加密发给服务端,之后两端都使用对称加密通信。
两种方式的结合看似很安全,其实还是存在问题。如果hanker比服务端先收到请求,hanker自己有一套公钥和私钥,将请求发送服务端后将拿到的服务端公钥,再将自己的公钥发给客户端,客户端就会将自己的钥匙发给hanker再有hanker发给服务端。此后CS两端的通信对于hanker都是可见的。
出现这样问题的原因在于客户端不知道发送消息的是不是客户端,为了解决这个问题就要引入证书这个概念。
证书
证书是由服务端向权威的CA机构申请后得到的。申请时需要服务器的各种信息,例如服务器的域名服务器的公钥以及服务器所有者的身份信息(可以用于追究法律责任)等,CA机构对数据进行哈希运算(将数据运算后生成一个固定长度的字符串——数据指纹或数据摘要,两个相似数据的数据指纹差别也会非常大,并且这个运算不可逆即不可能通过数据指纹获取原数据),然后对数据指纹用CA机构的私钥进行加密(CA机构也有自己的一套私钥和公钥,公钥在浏览器或者设备出厂时内置好了),这样就得到了签名。签名+服务器的信息就是证书。
有了证书后,客户端发送请求后,服务器就会将证书响应给客户端。客户端会对服务器信息作与CA相同的哈希算法,然后用CA的公钥对签名进行解密,最后将二者对比,如果相同就说明发消息的是服务端而不是hanker,同时将服务器信息中的公钥拿到。后面的通信使用对称加密即可。