深入浅出HTTPS协议,RSA算法,对称加密,非对称加密,数字签名,数字证书【包含极简又必不可少的数学推导】

本文主要是介绍深入浅出HTTPS协议,RSA算法,对称加密,非对称加密,数字签名,数字证书【包含极简又必不可少的数学推导】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

网上大多数介绍HTTPS协议和加密传输的文章都要么过于简洁,要么数学公式过多过于深奥。
本文将以一种更加清楚地结构,从根本原理上介绍HTTPS协议,RSA算法,对称加密,非对称加密,数字签名,数字证书等概念,会包含基础的数学原理,并且保证极其简明扼要

HTTPS 协议

HTTP 的不安全性体现在很多方面,即 HTTP 的缺点。

  • 内容被窃听:即使是加密过的通信内容,也会被窥视到,这点和未加密的通信是相同的,只能说经过加密后的内容,即便被攻击者窥视到,他也可能无法破解其中的含义罢了
  • 身份被伪装:服务器伪装,客户端伪装,访问权限,无意义请求
  • 报文被篡改:完整性不保证,中间人攻击(Main-in-the-Middle attack, MITM)

HTTPS 协议并非应用层的一个新协议,只是 HTTP 通信接口部分用 SSL(Secure Socket Layer)和 TLS(Transport Layer Security)协议代替而已。

另外,SSL 是独立于 HTTP 协议的,所有运行在应用层的协议都可以配合 SSL 协议使用。可以说,SSL 协议是当今世界上应用最为广泛的网络安全技术。

img

由于使用了加密通信, 相比于纯文本通信的 HTTP 来说,HTTPS 会消耗掉更多的 CPU 及内存资源,另外,开启 HTTPS 需要申请 SSL 证书,高额的证书申购费用会让很多网站开发者望而却步。

加密

密钥:就是钥匙,加密方有一把密钥,用来上锁,解密方也拥有一把密钥,用来解锁。而且加密方和解密方使用的密钥不一定是同一把。

对称密钥

加密和解密使用同一密钥的方式称为对称密钥加密,也称做共享密钥加密(Common Key crypto system)。

以共享密钥加密时必须将密钥也发送给对方。显然,如果通信双方都各自持有同一个密钥,且没有别人知道,则两方的通信安全是可以被保证的(除非密钥被破解),而且效率很高

那么,最大的问题就是如何保证这个密钥的安全传输,不被外部攻击者知道。如果由服务器生成一个密钥并传输给浏览器,这个传输过程中密钥被攻击者劫持,那么之后攻击者就能用这把密钥解开双方传输的任何内容。因此一般在建立连接时用非对称加密传输共享秘钥,之后通信时再用对称加密方法,即混合加密

非对称的密钥

加密和解密使用不同密钥

image-20220103155913168

RSA非对称秘钥加密算法

需要一个算法,正向计算容易,但逆向反推难——模运算符合这个特性:计算模简单,但反推指数难,只能穷举(当除数很大时不可取)

image-20220103160031123

使用模运算即可实现加密解密过程:

image-20220103160450751

合并两式得:

image-20220103160614581

如何选取e和d成为关键。此时要用到欧拉定理:

image-20220103160738502

这里的 φ ( n ) \varphi(n) φ(n) 表示:小于等于n的正整数中,有多少与n互质的数。将欧拉公式进行变换并对比上式可得下式,其中k为任意正整数

image-20220103161022883

可以通过选取k,n,e,计算得到d:

image-20220103161157322

计算 φ ( n ) \varphi(n) φ(n) 的一般方法为质因数分解,但大数质因数分解很难。但如果n是一个质数p,则有:

image-20220103161508551

运用到d的计算中:

image-20220103162218650

由于这里的p和q是自己选取,别人不知道,所以无法通过大数n的质因数分解得到p和q,因而无法计算出 φ ( n ) \varphi(n) φ(n)和 d

数字签名

遗憾的是,混合加密的方式仍然还是有漏洞的。攻击者(中间人)的确无法得到浏览器生成的对称密钥 X,但攻击者完全不需要拿到服务器私有的私钥就能劫持信息!

中间人只需截获服务器发布的公钥,篡改成自己的公钥发给客户端,客户端就会用中间人的公钥加密共享秘钥,中间人再用自己的私钥解密即可获得共享秘钥。根本原因是:浏览器客户端无法确认自己收到的公钥是不是真正的网站服务器的

img

❓ 如何证明浏览器客户端收到的公钥一定是该网站服务器的公钥

服务器在发布公钥和文件时,会同时用私钥将文件哈希值运算得到数字签名,放到网站上。客户端将文件的数字签名和公钥运算得到的文件哈希值与文件本身哈希值对比即可确定文件没有被篡改,并且签名来自于私钥拥有者。

image-20220103165636333

但私钥拥有者不一定等于服务器,因为中间人也可生成一套公钥私钥,对文件签名。客户端验证时使用伪公钥和伪签名对文件进行验证,依旧可以通过。

数字证书

为确保客户端验证时使用的是目的服务器的公钥和数字签名,需要使用公信机构: 数字证书认证机构(Certificate Authority, CA),即客户端和浏览器都信赖的第三方机构。

网站服务器在使用 HTTPS 前,需要向 CA 申请颁发数字证书,数字证书里有证书持有者、证书持有者的公钥,前两者的数字签名等信息。服务器把数字证书明文传输给浏览器客户端,然后浏览器从证书里取出服务器的公钥就可以了。

image-20220103170251956

由于计算机里默认安装了根证书,其中包括CA机构的公钥,因此数字证书具有不可为造性。

img

参考

https://www.bilibili.com/video/BV14y4y1272w?spm_id_from=333.788.top_right_bar_window_history.content.click
https://www.bilibili.com/video/BV18N411X7ty?spm_id_from=333.788.top_right_bar_window_custom_collection.content.click

这篇关于深入浅出HTTPS协议,RSA算法,对称加密,非对称加密,数字签名,数字证书【包含极简又必不可少的数学推导】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/294908

相关文章

nginx部署https网站的实现步骤(亲测)

《nginx部署https网站的实现步骤(亲测)》本文详细介绍了使用Nginx在保持与http服务兼容的情况下部署HTTPS,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录步骤 1:安装 Nginx步骤 2:获取 SSL 证书步骤 3:手动配置 Nginx步骤 4:测

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个