zoukankan      html  css  js  c++  java
  • 【网络知识之三】HTTPS协议

    HTTPS是身披SSL外壳的HTTP。HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。TLS是传输层加密协议,前身是SSL协议,由网景公司1995年发布,有时候两者不区分。

    一、HTTP通信存在的安全隐患
    http在通讯的过程中,以明文的形式进行传输,容易被黑客进行信息劫持和篡改:


    二、加密算法
    http通信隐患主要因为传输信息是明文,解决方案就是加密。那应该使用什么加密算法呢?
    (1)对称加密:信息的加密和解密都是通过同一个秘钥进行的,速度快,典型的对称加密算法有DES、AES,RC5,3DES等;
    (2)非对称加密:进行对称加密算法协商过程,速度慢,典型的非对称加密算法有RSA、DSA等;
    私钥加密后的密文,只要是公钥,都可以解密,但是反过来公钥加密后的密文,只有私钥可以解密。私钥只有一个人有,而公钥可以发给所有的人。


    https采用混合加密:结合非对称加密和对称加密技术。客户端使用对称加密生成密钥对传输数据进行加密,然后使用非对称加密的公钥再对秘钥进行加密,所以网络上传输的数据是被秘钥加密的密文和用公钥加密后的秘密秘钥,因此即使被黑客截取,由于没有私钥,无法获取到加密明文的秘钥,便无法获取到明文数据。

    三、SSL 证书(需要购买)和CA机构
    服务端向客户端发送公钥的过程,会有中间人劫持公钥问题:

    那就产生新的问题:如何安全的获取公钥,并确保公钥的获取是安全的?

    如上图所示,在第 ② 步时服务器发送了一个SSL证书给客户端,SSL 证书中包含的内容有证书的颁发机构、有效期、公钥、证书持有者、签名,通过第三方的校验保证了身份的合法,解决了公钥获取的安全性。

    理解以上过程需要先了解三个知识点:

    (1)数字摘要
    通过单向hash函数对原文进行哈希,将需加密的明文“摘要”成一串固定长度(如128bit)的密文,不同的明文摘要成的密文其结果总是不相同,同样的明文其摘要必定一致,并且即使知道了摘要也不能反推出明文。

    (2)数字签名
    对上面数字摘要通过私钥加密得出来的就是数字签名。

    (3)数字证书
    数字证书由权威的CA(Certificate Authority)机构给服务端进行颁发,CA机构通过服务端提供的相关信息生成证书,证书内容包含了持有人的相关信息,服务器的公钥,签署者签名信息(数字签名)等。
    数字证书包含三部分:证书内容,散列算法,加密密文,证书内容会被散列算法hash计算出hash值,然后使用CA机构提供的私钥对hash值进行RSA加密得到加密密文。

    浏览器为例说明如下整个的校验过程:

    (1)首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验

    (2)浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发

    客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。

    (3)如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。

    如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。

    (4)如果找到,那么浏览器就会从操作系统中取出颁发者CA的公钥,然后对服务器发来的证书里面的签名进行解密

    (5)浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名做对比

    (6)对比结果一致,则证明服务器发来的证书合法,没有被冒充

    (7)此时浏览器就可以读取证书中的公钥,用于后续加密了

    四、HTTPS认证

    HTTPS就是在应用层和传输层中间加了一道验证的门槛以保证数据安全

    HTTPS单向认证:

    HTTPS双向认证:双向认证和单向认证类似,它额外增加了服务端对客户端的认证

    参考
    数字证书

    HTTPS原理和CA证书申请

    HTTP和HTTPS协议

  • 相关阅读:
    mysql更新语句中的safe_mode
    MySQL数据类型详解
    刚更新完版本就炸了:java.lang.NoClassDefFoundError: org/apache/commons/io/output/UnsynchronizedByteArrayOutputStream
    微信支付分创建支付分订单+签名+验签
    根据序列号加密生产4*4的密码,如:X9PL-TERY-NOZN-GMF1
    对称加密:AES
    MySQL按中文排序
    腾讯云COS分片上传
    Linux中jar包指定端口、配置文件启动并记录日志
    Java8新特性两个关联集合合并成父子级
  • 原文地址:https://www.cnblogs.com/cac2020/p/11859105.html
Copyright © 2011-2022 走看看