网络编程5(HTTPS)
因为http协议的传输是明文的,就会引入了例如运营商劫持这样的安全问题,所以为了解决这样的问题就对http协议进行加密,加入了一个加密层,https就诞生了。
例如当我们在浏览器上下载一个软件,会通过运营商的路由器发送请求,获取到软件的下载地址,但是此时运营商服务器就会将我们获取到的地址进行篡改,这样的情况就是运营商劫持。因此HTTPS就会对请求数据进行加密,将明文加密得到密文,将密文解密得到明文,而加密解密过程中的一个关键数据就是密钥。
HTTPS的工作过程
既然要保证数据安全,就不能使用明文,而是经过加密后的密文,加密的方式有很多种其中主要的两种就是对称加密和非对称加密。
对称加密
对称加密其实就是通过一个相同的密钥,通过密钥进行加密,通过密钥进行解密,密钥就类似于一把钥匙,可以进行开锁也可以进行解锁。例如传输100这样的一个数据,通过密钥20,对数据加密得到2000,传输过程就传输2000,到了服务器就通过密钥进行解密得到100。由于黑客不知道密钥,就无法破解密文,这样的方法确实提高了较大安全性,但是暴露的问题也显而易见,就是多个服务器导致密钥的数量有很多,要维护起来非常麻烦,理想的方法就是在发送请求的时候同时发送密钥,但是此时的密钥不就以明文的形式进行传输了吗,黑客也就可以得到密钥了,那么之前的加密不就形同虚设了吗,所以对称加密就行不通了,此时就需要非对称加密。
引入非对称加密
非对称加密引入了两个密钥,公钥和私钥。
客户端先通过对称加密的密钥进行加密,然后通过公钥进行对对称加密密钥进行加密,然后通过明文发送给服务器,服务器会通过私钥进行解密,得到对称加密的密钥,再用这个密钥进行解密,最终得到明文。这样的黑客就算得到了公钥,没有私钥也就无法进行解密。这里不用非对称加密对数据进行加密是因为公钥解密太慢,只对密钥加密可以加快速度。但是又引入了新的问题,公钥要如何传输?公钥要如何判断是否是正确的?
中间人攻击
前面谈到了公钥的传输和安全性,是因为会出现“中间人攻击”的情况。先谈公钥传输,服务器会根据加密算法生成公钥1和密钥1,公钥1通过明文传输给客户端,之后就通过公钥加密的方式进行传输。但是黑客(中间人)就会自己生成一个公钥2和私钥2,在服务器返回公钥1的时候因为是明文的数据,中间人就可以将公钥1进行篡改成公钥2,这样客户端就会使用错误的公钥进行加密,发送给服务器,而中间人就可以将请求截获进行解密,再将错误的公钥改回来,发送给服务器,这样双方的通信就不知不觉中被获取篡改,所以又要想办法进行保证公钥的安全性,我们引入了证书。
引入证书
引入证书是为了解决公钥的安全性。证书其实就是一串字符串,服务端在使⽤HTTPS前,需要向CA机构(公证机构)申领⼀份数字证书,数字证书⾥含有证书申请者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书⾥获取公钥就⾏了,证书就如⾝份证,证明服务端公钥的权威性。证书中包含了:证书发布机构,证书有效期,公钥,证书所有者,签名,数字签名等。客户端验证证书的合法性是依靠数字签名。
数字签名
数字签名的形成:公证机构在生成之后,会针对证书进行计算,得到一个校验和,公证机构会生成自己的非对称密钥通过公钥对校验和进行加密,这样就得到了数字签名。
数字签名的验证:客户端拿到证书后,需要拿同样的算法进行重新计算校验和(客户端自己算的),得到校验和M,同时根据证书生成的公钥进行解密,将解密得到的校验和2进行对比,如果二者相同,就代表着证书是科学的,如果不相同,客户端就会弹出提示页面。
问题一:黑客能否将公钥修改?
不能的,如果修改的话就会导致计算出的校验和出现不一样的情况。
问题二:黑客能否将证书给整个替换掉?
不能,这是因为证书中包含网站的的域名,而域名是黑客不能拿到使用的。
问题三:黑客能否将证书中的数字签名修改?
不能,数字签名被私钥加密需要公钥进行解密。
问题四:证书生成的公钥要如何发送给客户端?黑客能否进行修改公钥?
不能,公钥不是通过网络进行传输的,而是内置在操作系统中的。