HTTP协议
HTTP是从万维网传输服务器传输超文本(HTML)到本地浏览器的传输协议。其过程没有任何的加密及身份验证机制,容易遭到窃听、劫持、篡改。
不安全原因主要有以下几点。
1、通信方式使用名文,内容可能被窃听。
2、不验证通信方的身份,因此有可能被伪装。
3、没有验证报文完整性、可能被篡改,加入恶意代码。
HTTPS协议
为解决以上问题,基于HTTP协议,Netscape公司制定了HTTPS协议。通过数据加密、身份认证、安全密钥、数据签名、摘要验证等机制将数据安全封装,再进行传输。减少了在数据传输过程中被窃听、篡改的可能。HTTPS的安全基础是SSL(Secure Socket Layer)安全套接层。其所有业务都使用在SSL握手过程中建立的密钥和算法进行加密。这样就防止了某些用户通过使用IP数据包嗅探工具非法窃听。尽管数据包嗅探仍能捕捉到通信的内容,但却无法破译。
SSL握手协议
它可以让服务器和客户机在传输应用数据之前,协商加密算法和加密密钥,客户机提出自己能够支持的全部加密算法,服务器选择最适合它的算法。
SSL记录协议
为SSL连接提供两种服务:
(1)机密性:握手协议定义了共享的、可用于对SSL有效载荷进行常规加密的密钥。
(2)报文完整性:握手协议还定义了共享的、可用来形成报文的鉴别码(MAC)的密钥。
使用到的加密技术
对称加密:
描述:在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yao)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。
缺点: 1、密钥传输风险
发送方和接收方必须要使用一个安全的信道建立密钥;消息的通信链路是不安全的。
2、密钥难管理
用户过多时,每对通信都使用不同密钥;想要相互通信,会导致密钥数量太多,假设 需要通信的人数是n人,则需要管理的密钥个数为:n(n-1)/2个,当人数过多时,密钥 数量会近指数倍暴增。
非对称加密:
简单理解:A公钥加密,A私钥解密;B私钥加密,B公钥解密
缺点:加密算法比较复杂,影响效率,不能传很大的数据。
百度百科解释:加密明文时采用公钥加密,解密密文时使用私钥才能完成,而且发信方(加密者)知道收信方的公钥,只有收信方(解密者)才是唯一知道自己私钥的人。不对称加密算法的基本原理是,如果发信方想发送只有收信方才能解读的加密信息,发信方必须首先知道收信方的公钥,然后利用收信方的公钥来加密原文;收信方收到加密密文后,使用自己的私钥才能解密密文。显然,采用不对称加密算法,收发信双方在通信之前,收信方必须将自己早已随机生成的公钥送给发信方,而自己保留私钥。由于不对称算法拥有两个密钥,因而特别适用于分布式系统中的数据加密。广泛应用的不对称加密算法有RSA算法和美国国家标准局提出的DSA。
CA证书
证书合法能被服务器/客户端信任。
服务器给客户端看:
CA证书机构颁发证书给网站
浏览器里面会记录这些证书
客户端告诉服务器:
如:网银
使用到的加密概念
数字签名及数据摘要
可以参考这个链接,通俗易懂:数字签名是什么? - 阮一峰的网络日志
签名就是在信息的后面再加上一段内容,一般是对信息做一个hash计算得到一个hash值,注意,这个过程是不可逆的,也就是说无法通过hash值得出原来的信息内容。在把信息发送出去时,把这个hash值加密后做为一个签名和信息一起发出去。 接收方在收到信息后,会重新计算信息的hash值,并和信息所附带的hash值(解密后)进行对比,如果一致,就说明信息的内容没有被修改过,因为这里hash计算可以保证不同的内容一定会得到不同的hash值,所以只要内容一被修改,根据信息内容计算的hash值就会变化。
原文链接:https://blog.csdn.net/ZZB_Bin/article/details/72967787
HTTPS加密原理图
数据发送端(A)加密
数据接收端(B)解密
实际应用中的SSL
双向身份认证
图中Alice作为服务器,Bob作为客户端
第一步:
客户端发起连接请求Client Hello
-
Random1:服务器生成的第二个随机数
-
Extensions:客户端支持的加密套件
第二步:服务器端发消息
-
Random2:服务器生成的第二个随机数
-
Cipher Suites:支持的加密套件
-
Extensions:服务器选择一个压缩方式
-
Certificate:证书
-
Server Key Exchange:服务器端公钥(S_public)
第三步:客户端发送消息
-
Client Key Exchange:发送预主密钥(经过S_public加密),Pubkey = 加密(预主密钥)
-
change Cipher Spec
-
Encrypted Handshake Message 加密握手消息
双方计算出:对称密钥(S_key)= Random(Client) + Random(Server) + 预主密钥
第四步:服务器响应客户端改变的密码规范,启用加密参数