前两天接连面试腾讯,阿里一面。都被问到了https相关的内容,答得并不满意,所以就打算将其相关的内容整理总结。
在说https之前,先说一下加密算法相关的内容
加密算法分为两种:即对称加密和非对称加密。
对称加密:对于对称加密来说。它的加密和解码的密钥是相同的。也就是说:明文加密成密文,和密文解密成明文使用的是同样的秘钥。
对称加密的优点:
对称加密在使用时,存在的问题:
常见的对称加密算法:DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES
非对称加密技术需要两个密钥,公钥和私钥成对出现。
公钥和私钥的作用:公钥加密的内容,私钥可以解密,反之私钥加密的内容,公钥可以解开。
非对称加密的基本过程:
非对称优点:
非对称缺点
场景的非对称加密算法::RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)。
下面简单来看一下一个比较简单的非对称加密算法,RSA加密算法。
a.互素数
互素数是指,两个公约数只有1的两个数,叫做互素数
关于互素数的结论
1.任意两个质数构成互质关系,比如13和61。
2.一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3
3. 如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如97和57。
4. 1和任意一个自然数是都是互质关系,比如1和99。
5.p是大于1的整数,则p和p-1构成互质关系,比如57和56。
6. p是大于1的奇数,则p和p-2构成互质关系,比如17和15。
b.欧拉函数
欧拉函数 ϕ ( n ) \phi(n) ϕ(n)是指:任意给定正整数n,求小于n的正整数之中,有多少个和n构成互质关系。这个数量即欧拉函数的值
关于欧拉函数的结论很多,我们只需要了解其中两条
如果n 是两个质数 p q的乘积,即n = p * q,则一定有下面等式成立
ϕ ( n ) = ( p − 1 ) ∗ ( q − 1 ) \phi(n) = (p - 1)*(q-1) ϕ(n)=(p−1)∗(q−1)
即,小于n并且和n互素的数,一共有 (p - 1)*(q-1) 个
如果n和e互素的,则一定满足下面的关系式(费马-欧拉定理)
e ϕ ( n ) % n = 1 e^{ \phi(n)} \% n =1 eϕ(n)%n=1
c.模反元素
如果两个正整数a和n互质,则一定存在一个正整数d,使的下面等式成立
a ∗ b % n = 1 a * b\% n =1 a∗b%n=1
即 a和b的乘积对n取余的结果为1
基本的数学铺垫完成,接下来看看公钥和私钥的生成
注意:在计算过程中的,p和q不能泄露,防止直接计算出 ϕ ( n ) \phi(n) ϕ(n)值,然后猜想出d的值。
另外:3,4,5步骤的数学原理,在上面有简单提过
m:明文,c:密文
加密公式:
c = m e % n c = m^e \% n c=me%n
解密公式
m = c d % n m = c^d \% n m=cd%n
举例:用上面的公钥秘钥对 2进行加密解密
加密:
2 7 % 15 = 8 2^7 \% 15 = 8 27%15=8
解密:
8 13 % 15 = 2 8 ^{13} \%15 = 2 813%15=2
下面我们来证明一下,明文可以通过上面的步骤,来进行加密和解密,即证明两个式子是等价的:
加密过程:
c = m e % n c = m^e \% n c=me%n
从上面的式子,可以得到:
c = n 的 倍 数 + m e c= n的倍数 +m^e c=n的倍数+me
等式两边同时d次方:
c d = ( n 的 倍 数 + m e ) d c^d= (n的倍数 + m ^e )^d cd=(n的倍数+me)d
可以转换为下面的式子,注意上下的倍数可能不同:
c d = n 的 倍 数 + m e d c^d= n的倍数 + m ^{ed} cd=n的倍数+med
根模反函数可得下面的式子,t也是未知,表示倍数:
c d = n 的 倍 数 + m ϕ ( n ) 的 倍 数 + 1 c^d= n的倍数 + m ^{{ \phi(n)的倍数} +1} cd=n的倍数+mϕ(n)的倍数+1
转换为:
c d = n 的 倍 数 + m ∗ m ϕ ( n ) 的 倍 数 c^d= n的倍数 + m*m ^{ \phi(n)的倍数} cd=n的倍数+m∗mϕ(n)的倍数
根据费马欧拉定理可得:
c d = n 倍 数 + m ∗ ( 1 + n 的 倍 数 ) c^d= n倍数 + m*( 1+ n的倍数) cd=n倍数+m∗(1+n的倍数)
整理得:
c d = n 的 倍 数 + m c ^d = n的倍数 + m cd=n的倍数+m
即:
c d % n = m c ^d \%n = m cd%n=m
hash算法,也是一个很常见的检验算法,但不是一个加密算法,我们常说的md5,就是hash算法的一种。下面来简单的看一看hash算法。
哈希函数,也称为散列函数或者杂凑函数。哈希函数是一个公开函数。可以将任意长度的消息m映射为一个长度较短的固定值H(M),他是一种单向密码体制,即一个明文到密文的不可逆映射,只有加密过程,没有解密过程
无论输入是什么格式,文件有多大,输出都是固定长度的比特串。以比特币使用的Sh256算法为例,无论输入是什么数据文件,输出的都是256bit
其实从上面的哈希概述中就能看出,哈希与加密的两个重要的区别:
哈希算法 R = H ( S ) R = H(S) R=H(S)是一个多对一映射,给定目标文本S,H可以将其唯一映射为R,并且对于所有S,R具有相同的长度。由于是多对一映射,所以H不存在逆映射 S = H − 1 S = H^{-1} S=H−1。
解密算法 R = E ( S , K E ) R = E(S,K_E) R=E(S,KE)是一个一一映射,其中第二个参数就是加密密钥,E可以将给定的明文密钥 K e K_e Ke唯一映射为密文R,并且存在另一个一一映射 S = D ( R , K D ) S = D(R,K_D) S=D(R,KD),可以结合 K d K_d Kd将密文R唯一映射为明文S,其中 K d K_d Kd叫做解密密钥。
但是符合上面的定义的映射仅仅可以被叫做哈希算法和加密算法,但未必是好的哈希和加密,好的哈希和加密往往需要需要满足下面比较贱
一个好的哈希算法:
一个设计良好的哈希算法应该很难从哈希结果找到哈希目标文本的碰撞。一个好的哈希应该对输人的变化及其敏感,即使有危险的改动了,比如一亿个字符改变了一个字符,那结构也也应该不同
碰撞是指,如果 S 1 ≠ S 2 , H ( S 1 ) = H ( S 2 ) S_1\neq S_2,H(S_1) = H(S_2) S1̸=S2,H(S1)=H(S2),则S1和S2互为碰撞。
一个好的加密算法:
一个设计良好的加密算法,应该是一个“单向陷门函数”,即一般情况下,即使知道函数本身也很难将函数的值换回函数的自变量,具体到加密就是说很难从密文得到明文,虽然理论可以,而陷门是一种特殊的元素,一旦知道陷门,则这种逆转换是很容易进行的,具体到加密算法,陷门就是秘钥。
要实现数据的保护,可以选择哈希或加密两种方式,那么什么时候惦哈希,什么时候选择加密呢
基本原则:如果被保护的数据仅仅用作比较验证,之后不需要还原成明文形式,则使用哈希。如果被保护的数据在以后还需要被还原成明文,则需要使用加密。
下面总结一下哈希算法的特点:
数字签名是什么(公钥数字签名,电子签章),用于鉴别数字信息的方法,一套数字签名通常定义了两种互补的起那么。
签名作用 :数字签名对于原文的保密性没有要求,但是负责两件事:发送者的身份,发送的内容是否完整
签名原理:发送的内容是否完整,可以使用上面说的哈希算法,生成一段摘要 。根据再要来验证内容是否完整。而身份的验证,可以使用我们前面说的非对称加密算法(可以使用RAS)。发送者可以使用自己的私钥对摘要进行加密。接收者根据公钥,来进行解密。解密成功,确认发送者。
一次完整的签名过程
A为发送者,B为接收者
验证过程
数字签名的问题
在这个过程中,存在一个漏洞,那就B验证A身份时,使用的A的公钥进行验证。在这个过程中可能存在问题。
对于这个问题的解决,就需要数字证书的加入
为了解决上面的问题,即保证B收到的公钥一定是A发出了的。所以引入了一个证书中心(CA机构),为A的公钥做认证。具体的方法就是,用该CA机构使用自己的私钥对A的公钥进行加密生成“数字证书”
证书的获得
证书的发送
证书的验证
证书的问题
前置基础基本已经铺垫好了,现在正是进入正题——Https
在之前的文章里,我们详细介绍过HTTP,HTTP发出的内容是明文,任何人都可以通过抓包获取获取到,非常的不安全。
所以为了保护发送报文的安全性,所以提出了HTTPS,HTTPS是密文传输。一般难以获取报文。
简单的说,HTTPS = HTTP +SSL/TSL
HTTPS的加密是将对称加密和非对称加密结合起来,非对称加密用于HTTPS的连接,身份的校验,传输对称加密的秘钥。对称加密连接建立后传输包。
HTTPS同HTTP相比提供了:
上面我们我们说HTTPS = HTTP +SSL/TSL。那我们来看看,SSL和TLS是什么
SSL即Secure Socket Layer(安全套接字层),为Netscape所研发。是保证数据安全技术,目前是SSL3.0版本
为于可靠的面向连接的网络层协议(TCP)和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。。
TLS(Transport Layer Security,传输层安全协议),位于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议
两种其实是一种并列关系,即最新版本的TLS是IETF制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。
两者的差异:
TLS与SSL的差异
1)版本号:TLS记录格式与SSL记录格式相同,但版本号的值不同,TLS的版本1.0使用的版本号为SSLv3.1。
2)报文鉴别码:SSLv3.0和TLS的MAC算法及MAC计算的范围不同。TLS使用了RFC-2104定义的HMAC算法。SSLv3.0使用了相似的算法,两者差别在于SSLv3.0中,填充字节与密钥之间采用的是连接运算,而HMAC算法采用的是异或运算。但是两者的安全程度是相同的。
3)伪随机函数:TLS使用了称为PRF的伪随机函数来将密钥扩展成数据块,是更安全的方式。
4)报警代码:TLS支持几乎所有的SSLv3.0报警代码,而且TLS还补充定义了很多报警代码,如解密失败(decryption_failed)、记录溢出(record_overflow)、未知CA(unknown_ca)、拒绝访问(access_denied)等。
5)密文族和客户证书:SSLv3.0和TLS存在少量差别,即TLS不支持Fortezza密钥交换、加密算法和客户证书。
6)certificate_verify和finished消息:SSLv3.0和TLS在用certificate_verify和finished消息计算MD5和SHA-1散列码时,计算的输入有少许差别,但安全性相当。
7)加密计算:TLS与SSLv3.0在计算主密值(master secret)时采用的方式不同。
8)填充:用户数据加密之前需要增加的填充字节。在SSL中,填充后的数据长度要达到密文块长度的最小整数倍。而在TLS中,填充后的数据长度可以是密文块长度的任意整数倍(但填充的最大长度为255字节),这种方式可以防止基于对报文长度进行分析的攻击。
下面说一下,基于SSL的HTTPS的请求过程
握手过程:
传输数据过程
HTTP的双向认证
上面说的是单向证书认证。
在这种情况下,客户端可以验证服务端的身份,但服务端不能验证客户端的身份。
所以在异乡要求安全性比较高的场景中,使用双向验证,即客户端验证服务端证书,服务端验证客户端证书
https的安全性考虑
成本考虑
RSA 非对称加密原理(小白也能看懂哦~)
b站妈咪说视频《素数6,基于欧拉函数的RAS加密》
哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用
数字签名和数字证书的原理解读(图文)
HTTPS工作原理
极客时间 趣谈网络协议 https协议:点外卖的过程原来这么复杂