HTTPS的一些研究
https就是在http的基础上增加一层加密算法,这一层算法我们叫TLS或者SSL。但具体 TLS/SSL 确一直不怎么了解,这次通过一些问题熟悉下 TLS/SSL 。
对称加密 和 非对称加密
对称加密是指用同一个密钥就可以完成加密和解密的操作。
这和具体的加解密的算法无关,只要是用的同一个密钥,哪怕加解密不是用的同一种算法,但他也是对称加密。
与之对应的是非对称加密,非对称加密要两个密钥,加密用的我们称之为公钥,解密用的我们称之为私钥。因为加密密钥可以公开,只要你们用加密密钥,我就能保证我用解密密钥解出来,所以加密密钥成为公钥,而解密密钥要自己保存,称为私钥。
针对HTTP传输的场景,用哪种加密更好:
对称加密:因为对称加密密钥同一个,而在客户端/浏览器端存放密钥是不安全的,所以只要客户端的密钥泄露了,这个加密就破解了。
非对称加密:相比下非对称加密就很安全,但是有个效率上的问题:非对称加密一般由于算法复杂,计算需要时间,而且在传输大量内容的情况下效率就会更加低下,这对HTTP场景就是个缺陷了。
HTTPS解决的方案是用非对称加密的方案加密密钥,再使用该密钥进行对称加密。
TLS/SSL 是对称加密还是非对称加密?
答:TLS本身是一个混合加密系统,也就是说它使用了对称加密和非对称加密两种方式。具体流程如下:
-
客户端向服务端打招呼,请求建立HTTPS链接(客户端发送Client Hello 消息到服务器,并携带了TLS版本和一个客户端随机数),此时是明文传输;
-
服务端收到后,返回证书和一个服务器随机数(公钥包含再证书里),此时是明文传输;
-
客户端验证证书有效性,若有效,则拿着随机数生成一个
pre-master key
(也就是后面传输用的密钥),并用证书中的公钥进行加密,传给服务器。服务器拿着pre-master key
可以算出密钥。 此时是非对称加密。 -
客户端拿着这个密钥和服务器进行通信。对称加密。
CA(证书签发机构)和证书的作用
证书签发机构,又称CA(Certificate Authority),负责证书的签发,而证书的主要作用是验证该网站的身份。
举个例子,比如说A向B请求建立HTTPS通信,C想在中间捣乱。不能说因为B持有证书,所以C就无法捣乱,因为C也可以去申请一个证书,证书的申请与该网站的性质(是不是好网站、坏网站)没有关系,而是要验证B是B,C是C。A拿着请求到的证书就知道数据是B返回的还是C返回的,也就排除了C假装B回消息的可能。
为什么不用签名,而是用证书
签名就是非对称加密的另一种用法。一个文件(或数据),我用私钥进行加密,得到一串xxxx,然后将该文件和xxxx公布出去。这时另一个人想下载该文件(或读取该数据),就可以对xxxx用公钥做解密,如果最终结果和该文件是一样的,就证明该文件是我给你的。
证书内部其实用到的也是签名,只不过签名也需要公钥,这样就又得证明证书的公钥是来自我的,这就又要对证书的公钥进行签名,然后证书公钥的公钥也要签名,这样就没有尽头了。所以CA的作用就体现出来了,CA说在这我列出来的这一堆公钥里面,你客户端必须无条件信任(不然就没完了),这堆公钥就叫做根证书。
CA会跟操作系统合作,把根证书埋在操作系统里,所以只要客户端拿到证书后,只要证书一层层往上找,只要能有一个被跟操作系统中的根证书认证,那咱就信任这个公钥了,上面的流程也就走通了。
客户端的安全
- 没有绝对的安全。技术的发展就是这样,加密-破解-反破解-更强的加密-....,而且就算是不可逆的算法(md5),也能通过暴力的方法(数据库查找)来找到元数据,所以我们所做的只是增加破解难度。但现阶段来说,https是安全的。
- 使用HTTPS;
- 业务数据使用对称加密;敏感信息(如密码)使用不可逆加密;
- 跟金额相关,要做多重验证(比如前端传一个价格,后端要自己查下接口验证下价格是否正确);
- 混淆、app加固;