• HTTPS


     

    1 HTTP缺点

    HTTP是明文传输的,也就意味着,介于发送端、接收端中间的任意节点都可以知道传输的内容是什么。

    因此HTTP具有如下的缺点:

    1. 窃听风险:被第三方通信内容。

    2. 篡改风险:第三方修改客户端和服务券的通信内容。

    3. 冒充风险:第三方可以仿冒客户端或者服务端发给对端的通信内容。

    2 HTTPS

    HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据

    2.1 客户端发起HTTPS请求

    客户端与服务端之间建立TCP连接,使用的是443端口

    2.2 handshake协议(握手协议)

    client发送ClientHello,指定版本,随机数(RN),所有支持的密码套件(CipherSuites):

    1. TLS的版本
    2. 随机数:这个是用来生成最后加密密钥的影响因子之一,包含两部分:时间戳(4-Bytes)和随机数(28-Bytes)
    3. session-id:用来表明一次会话,第一次建立没有。如果以前建立过,可以直接带过去。
    4. 加密算法套装列表:客户端支持的加密-签名算法的列表,让服务器去选择。
    5. 压缩算法:似乎一般都不用
    6. 扩展字段:比如密码交换算法的参数、请求主机的名字等等

    收到client hello后,服务器恢复ACK,没有使用捎带确认

    server回应ServerHello,指定版本,RN(服务器生成的随机数,稍后用于生成"对话密钥"),选择CipherSuites,会话ID(Session ID)

    通过这一步,客户端和服务器就完成了加密和签名算法的交换。

    server发送Certificate

    然后,服务器给客户端展示证书

    ServerKey Exchange:用来发送密钥交换算法相关参数和数据的。根据密钥交换算法的不同,传递的参数也是不同的。

    ServerHello Done:服务器要传输的信息结束

    client拿到servercertificate后,就可以开始利用certificate里的public key进行session key的交换了。

    ClientKey Exchange:客户端对Server Key Exchange的回应,用于交换密钥需要的参数。和服务器一样,不同的密钥交换算法实现是不一样的,因此需要的参数也是有差异的:包含pre-master secret。客户端生成第三个随机数。如果是采用RSA算法,会生成一个48字节随机数,然后用server的公钥加密之后再放入报文中;

    change_cipher_spec 客户端使用上面的3个随机数client random, server random, pre-master secret, 计算出48字节的master secret, 这个就是对称加密算法的密钥。

    Server-Client已经将服务器认证的相关工作做完了,密文函数&密钥交换需要的参数也都相互传递了。

    1. server hello 中选择了加密函数
    2. ServerKey Exchange:传递加密函数的一个参数
    3. ClientKey Exchange:传递了机幂函数的另一个参数。这个参数是使用服务器的公钥加密过的

    Encrypted Handshake Message:表明握手已经完成,并且对之前发过的数据进行加密发送给对方做校验,防止被篡改。同时也验证一下,加密算法、密钥工作是否正常。

    总结

    SSL/TLS握手过程可以分成两种类型:

    1. 双向认证,就是双方都会互相认证,也就是两者之间将会交换证书。
    2. 单向认证,客户端会认证服务器端身份,而服务器端不会去对客户端身份进行验证

    这个过程实际上产生三个随机数:client random, server random, pre-master secret.前两个随机数都是明文传送的,只有pre-master secret是加密的(RSA或者DH)。server使用RSA证书,RSA即可以用作签名也可以用作不对称加密,pre-master secret就是用server的RSA证书中包含的公钥加密的。

     3 HTTP与RAS

    RSA算法在:

    1. 证书签名的时候
    2. 密钥交换

    RAS计算过程:

    1. 选两个超级大的素数:p 和 q

    2. 把他们乘起来:n = p * q

    3. 然后把p-1和q-1也乘起来:m = (p - 1) * (q - 1)

    4. 再找一个和m互质的数:e -> gcd(e, m) = 1

    5. 最后,找一个d,满足:(e * d) mod m = 1然后公钥就是(n, e)的组合,私钥就是(n, d)的组合

    4 HTTPS与STL

    TLS要做的事情就是两个:身份校验 & 加密算法和密钥协商。

  • 相关阅读:
    Git分支合并:Merge、Rebase的选择
    linux系统下MySQL表名区分大小写问题
    Spring Mvc和Spring Boot读取Profile方式
    Git删除远程分支
    TortoiseGit push免输密码
    git [command line] fatal: Authentication failed for
    Jenkins [Error] at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.redeploy(AbstractTomcatManagerDeployer.java:192)
    FAIL
    WIN下修改host文件并立即生效
    MYSQL 创建数据库SQL
  • 原文地址:https://www.cnblogs.com/perfy576/p/8574482.html
Copyright © 2020-2023  润新知