社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何形式的数据加密。
HTTP的问题:
HTTPS = HTTP + 加密 + 认证 + 完整性保护
HTTP可以通过SSL或者TLS来加密HTTP通信。用SSL建立安全通信线路之后,就可以在这条线路上进行HTTP通信了,与SSL组合使用的HTTP被称为HTTPS。HTTPS是对通信进行加密,而不是内容加密。
SSL是一个私有协议,TLS是一个公有协议,是针对SSLv3的改版
还可以对HTTP发送的内容进行加密,此种方式要求双方同时具备加密和解密机制。
SSL提供证书来确定通信方的身份。SSL证书由值得信任的第三方机构进行颁发,用以证明服务器和客户端是实际存在的。
SSL是一个不依赖于平台和应用程序的协议,用于保障TCP-based应用安全,SSL在TCP和应用层之间,就像应用层连接到TCP连接的一个接口。
报文在传输的过程中,遭攻击者拦截并篡改内容的攻击成为中间人攻击。常用MD5和SHA-1等散列值校验的方法以及用来确定文件的数字签名方法来确定报文完整性。这些方法无法百分百保证确认结果正确。
HTTPS不是一种新的传输协议,只是HTTP的通信接口部分用SSL和TLS协议替代,SSL协议依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。
通常,HTTP直接和TCP进行通信。当使用SSL时,HTTP先和SSL通信,然后由SSL和TCP进行通信。
SSL是独立于HTTP的协议,其他应用层协议均可配合SSL协议使用。SSL/TLS协议是一种向后兼容的协议
SSL采用公开密钥加密的加密处理方式。即加密算法公开,密钥保密。客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文之后,用自己的私钥解密。
共享密钥加密:也叫对称密钥加密,即加密和解密使用同一个密钥的方式。
因为共享密钥加密要安全地转交密钥,并且还得设法安全的保管接受到的密钥,因此出现了公开密钥加密,很好的解决了这个问题。
公开密钥加密使用一对非对称的密钥。私有密钥用来解密,公开密钥可以随便发布。
发送方通过公开密钥对发送的内容进行加密,接收方接收到内容后用私有密钥来进行解密。通过密文和公开密钥恢复信息原文异常困难,解密过程就是在对离散对数进行求值。
如何保证公钥不被篡改
解决办法:将公钥放在数字证书中。只要证书可信,公钥就可信。
公开密钥加密计算量太大,如何减少耗用时间
解决办法:每次对话都生成一个对话密钥(session key),用它来加密信息。由于对话密钥是对称加密,因此运算速度非常快,而服务器的公钥只用于加密对话密钥,由此减少了加密运算的消耗时间。
在实际中,一般都是利用公钥加密给对方发送一个密钥,之后用此密钥作为对称加密的密钥进行通信。
这样既利用了公钥加密可以公开加密的特点,又利用了对称加密速度快的特点。
RSA算法是一种非对称加密算法,1977年提出,在公开密钥加密和电子商业中被广泛使用。
RSA算法分为公钥加密算法和签名算法。
若两个正整数除了1之外没有其他的公因子,就成这两个数为互质关系。
构成互质关系的情况:
欧拉函数用来计算不大于一个数的正整数中有多少个数可以与其构成互质关系。用φ(n)表示。
若n是两个质数p和q的乘积,则一定有
φ
(
n
)
=
(
p
−
1
)
∗
(
q
−
1
)
φ(n) = (p - 1) * (q - 1)
φ(n)=(p−1)∗(q−1)
若n和e互质,则
a φ ( n ) = 1 ( m o d n ) a^{φ(n)} = 1(mod:n) aφ(n)=1(modn)
若两个正整数a和n互质,则一定存在一个正整数d,使得a * b % n = 1;
RSA加密算法是用公钥对数据进行加密,私钥用于对数据解密。
使用公钥(n,e)对m进行加密,m必须是整数(字符串可以取ASCII值或者Unicode值)且小于n。
c
=
m
e
m
o
d
n
c = m^e:mod:n
c=memodn
使用私钥(n,d)对c进行解密:
m
=
c
d
m
o
d
n
;
c
d
=
m
e
d
=
m
m
o
d
n
m = c^d:mod:n;c^d = m^{ed} = m:mod:n
m=cdmodn;cd=med=mmodn
签名算法中用私钥对数据进行签名,公钥对签名进行验证
签名算法的密钥生成步骤和加密算法的生成步骤一样。
使用私钥对m进行签名σ。
σ
=
m
d
m
o
d
n
σ = m^d:mod:n
σ=mdmodn
通过以下公式计算m‘,然后与m进行对比,若相等,则验证通过,否则,验证失败。
m
′
=
σ
e
m
o
d
n
m' = σ^e:mod:n
m′=σemodn
DH算法是说通信双方都采用一个公开信道传递消息,但只有彼此才能够分享一个相同的密钥S,其他人即使获取到了公开信道中的任何消息,都无法计算出密钥S。
DH算法计算密钥步骤:
Alice和Bob先对p和g达成一致并且公开出来。
Alice取一个私密整数a,将下列公式产生的计算结果A发给Bob。
A
=
g
a
m
o
d
p
A = g^a:mod:p
A=gamodp
类似的,Bob也取一个私密整数b,将下列公式产生的计算结果B发送给Alice。
B
=
g
b
m
o
d
p
B = g^b:mod:p
B=gbmodp
Alice根据以下公式计算出对称密钥S:
S
=
B
a
m
o
d
p
=
(
g
b
)
a
m
o
d
p
=
g
a
b
m
o
d
p
S = B^a:mod:p = (g^b)^a:mod:p = g^{ab}:mod:p
S=Bamodp=(gb)amodp=gabmodp
Bob通过以下公式计算出对称密钥S
S
=
A
b
m
o
d
p
=
(
g
a
)
b
m
o
d
p
=
g
a
b
m
o
d
p
S = A^b:mod:p = (g^a)^b:mod:p = g^{ab}:mod:p
S=Abmodp=(ga)bmodp=gabmodp
可以发现两人得出的对称密钥S是一样的。
签名作用:用来验证信息的完整性和准确性。
**签名原理:Hash算法不可逆。**Hash算法是一种多对一映射。Hash算法将一段任意长度的值生成一段固定长度的值。
签名流程:
数字证书用来验证公开密钥的正确性。
证书包含:申请者公钥、申请者的组织信息和个人信息、签发机构CA信息、有效时间、证书序列号等信息的明文,同时包含一个数字签名。
如果数字证书被伪造了,那么可以一致请求给当前CA做保证的上一级CA,这样一直递归查询,直到找到一个根CA机构。根CA机构的公钥一般直接写入到操作系统的底层中,以保证可靠性。
HTTPS使用共享密钥加密和公开密钥加密两者并用的混合加密机制。
在交换密钥环节使用公开密钥加密方式,之后建立通信交换报文阶段使用共享密钥加密方式。
前两步成为握手阶段。
总结来说,可以分为以下五部分:
通过wireshark的一次抓包分析来看,基于TLS1.2:
握手阶段用来建立SSL连接。若处于某种原因而导致会话中断,就需要重新进行握手。
此时有两种方式恢复原来的session:session ID和session ticket。
session ID是说每次对话都有一个session ID。若对话中断,下次重连的时候,客户端只需给出session ID,且服务器端有此session ID的记录,双方就可以重新使用已有的对话密钥,而不需重新生成一把。
session ID是目前浏览器都支持的方法,但是往往只保留在一台服务器上,因此若请求发送至另一台服务器的话,就无法恢复会话。session ticket就是为了解决这个问题的。
session ticket中,客户端发送的不再是session ID,而是session ticket。session ticket是加密的,只有服务器才能解密,其中包括本次对话的主要信息,比如对话密钥和加密方法。当服务器收到session ticket后,解密后就不必重新生成对话密钥了。
阮一峰的工作日志——HTTPS部分内容
维基百科
图解HTTP
Wireshark抓包工具
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!