HTTPS虐我千百遍,我却待她如初恋!
点击上方“朱小厮的博客”,选择“设为星标”
后台回复”加群“加入公众号专属技术群
来源:http://suo.im/5lYNlh
本篇将讨论 HTTPS 的加解密原理,很多人都知道 RSA,以为 HTTPS=RSA,使用 RSA 加解密数据,实际上这是不对的。
HTTPS 是使用 RSA 进行身份验证和交换密钥,然后再使用交换的密钥进行加解密数据。
身份验证是使用 RSA 的非对称加密,而数据传输是双方使用相同的密钥进行的对称加密。那么,什么是对称加密和非对称?
对称加密和非对称加密
假设隔壁小王想要约小红出来,但是他不想让小明知道,于是他想用对称加密给小红传了个小纸条。
他想发送的数据是"Meet at 5:00 PM"(5 点见面,如果是中文的话可以使用 UTF-8 编码),加密方式是直接在 ASCII 表进行左移或右移。
他的密钥是 3,表示在 ASCII 表往后移 3 位,就会变成"Phhw#dw#8=33#SP",这样一般人如果截获了不知道是什么意思的。
但是我们可以想一下,如果既然他可以截获你的数据,自然也可以截获你的密钥,进而进行解密。
所以小王打算用非对称加密,非对称加密的特点是双方都有自己的公钥和私钥对,其中公钥发给对方,密钥不交换自己保管不泄漏。
public_key = (N, e) = (3233, 17)
她把公钥发给了小明,她自己的私钥为:
private_key = (N, e) = (3233, 2753)
他要发送的第一个字母为 t=“M”,“M”的 ASCII 编码为 77,77 的加密过程如下计算:
T = 77 ^ e % N = 77 ^ 17 % 3233 = 3123
小红收到 T 之后便用她的私钥进行解密,计算如下:
t = T ^ e % N = 3123 ^ 2753 % 3233 = 77
HTTPS 连接建立过程
验证服务方身份,如我访问 google.com 的时候连的确实就是谷歌服务器
防止数据被劫持,例如有些运营商会给 http 的页面插入广告
防止敏感数据被窃取篡改等
正如 openssl 的注释所说,这是防止中间人攻击的唯一方法:
如下图所示:
在 Client Hello 里面客户端会告知服务端自己当前的一些信息,如下图所示:
服务端在 Server Hello 里面会做一些响应:
密钥交换使用 ECDHE
证书签名算法 RSA
数据加密使用 AES 128 GCM
签名校验使用 SHA256
接着服务给客户端发来了 4 个证书:
一个证书里面会有什么东西呢,我们可以展开第一个证书看一下,如下图所示:
tbsCertificate(to be signed certificate)待签名证书内容
证书签名算法
CA 给的签名
身份验证
我们先来看一下 tbsCertificate 里面有什么内容,如下图所示:
Amazon 的证书也具备上述结构,我们可以把 Amazon 证书的公钥拷出来,如下图所示:
然后我们用这个 CA 的公钥对 mozilla.org 的证书签名进行解密,方法和上面的类似:
接下来我们手动计算一下 tbsCertificate 的 SHA256 哈希值,方法是在 wireshark 里面把 tbsCertificate 导出一个原始二进制文件:
然后再使用 openssl 计算它的哈希值,如下所示:
liyinchengs-MBP:https liyincheng$ openssl dgst -sha256 ~/tbsCertificate.binSHA256(/Users/liyincheng/tbsCertificate.bin)= 5e300091593a10b944051512d39114d56909dc9a504e55cfa2e2984a883a827d
并且第四个证书是根证书,它是内置于操作系统的(通过 Mac 的 keychain 工具可以查看):
例如通过打电话或者发邮件等方式告知服务器的签名,与自己算的证书的签名是否一致,如果一致说明证书没有被篡改过(如证书的公钥没有被改为 Hacker 的公钥):
密钥交换
而使用 ECDHE 是一种更安全的密钥交换算法。如下图所示,双方通过 ECDHE 进行密钥交换:
这个算法的思想如下图所示:
椭圆曲线加密
现在的证书的签名算法有两种:RSA 和新起的 EC。如下图所示,google.com 便是使用的 ECC 证书:
如下图所示,有一条椭圆曲线方程:
y ^ 3 = x ^ 2 + ax + b:
为了计算 3G 的坐标,如下图所示:
EC 的难点在于给定起点 G 和点 K:
K = kG
把这两个点便是加密后的数据,发给对方,对方收到后使用私钥 K 进行解密,过程如下:
M = C2 - rK = C2 - rkG = C2 - rkG = C2 - kC1
ECC 密钥交换
原理很简单,如下图所示:
而曲线方程是规定好的,例如 Curve X25519 使用的曲线方程为:
y^2 = x^3 + 486662x^2 + x
在密钥交换里面会指定所使用的曲线方程,如下图所示:
HTTPS 证书的应用
EV 证书会在浏览器的地址栏显示证书的企业名称:
但是新版的 Chrome 似乎把这个去掉了,所以我们打开 medium 的控制台可以看到一个提示:
As part of an experiment, Chrome temporarily shows only the lock icon in the address bar. Your SSL certificate with Extended Validation is still valid.
另外我们可以用 openssl 生成一个自签名证书,执行以下命令:
openssl req -x509 -nodes -sha256 -days 365 -newkey rsa:2048 -keyout test.com.key -out test.com.crt
便会得到两个文件,test.com.crt 是证书,test.com.key 是证书的私钥,如下图所示:
然后把这两个文件给 Nginx 使用便能使用 HTTPS 访问,如下代码所示:
server {listen 443;server_name test.com;ssl on;ssl_certificate test.com.crt;ssl_certificate_key test.com.key;}
客户端证书
签名验证算法和上文讨论的 TLS 证书一致。为什么可执行文件需要签名呢,因为如果不签名的话,系统会拦截安装或者运行,如 Mac 双击一个未签名的 dmg 包的提示:
直接不让你运行了,而 Windows 也有类似的提示,Windows 是会给一个警告:
而当我们运行一个已签名的 exe 文件将会是正常的提示,如 Chrome 的提示:
想知道更多?扫描下面的二维码关注我
怎么加群?:
怎么免费加入知识星球:
免费资料入口:后台回复“666”
朕已阅
HTTPS虐我千百遍,我却待她如初恋!相关推荐
- 算法虐我千百遍,我待算法如初恋
转自:算法虐我千百遍,我待算法如初恋 算法虐我千百遍,我待算法如初恋. 学习方法 1) 把所有经典算法写一遍 2) 看算法源码 3) 加入算法学习社区,相互鼓励学习 4) 看经典书籍 基本数据 ...
- Maven 虐我千百遍,我待 Maven 如初恋 侵删
前言 在如今的互联网项目开发当中,特别是Java领域,可以说Maven随处可见.Maven的仓库管理.依赖管理.继承和聚合等特性为项目的构建提供了一整套完善的解决方案,可以说如果你搞不懂Maven,那 ...
- 客户虐我千百遍,我待客户如初恋
误闯误撞,进入了IDC行业,从事了服务器租用及托管的销售工作.很多人问我,什么是IDC,什么是服务器?我知道我解释的过于专业那么会有更多的问题,毕竟自己也不是百科全书,只好简答回复"没有显示 ...
- 第十九期:HTTPS虐我千百遍,我却待她如初恋!
本篇将讨论 HTTPS 的加解密原理,很多人都知道 RSA,以为 HTTPS=RSA,使用 RSA 加解密数据,实际上这是不对的. 图片来自 Pexels HTTPS 是使用 RSA 进行身份验证和交 ...
- Maven虐我千百遍,我待Maven如初恋
前言 在如今的互联网项目开发当中,特别是Java领域,可以说Maven随处可见.Maven的仓库管理.依赖管理.继承和聚合等特性为项目的构建提供了一整套完善的解决方案,可以说如果你搞不懂Maven,那 ...
- 数学歌单:数学虐我千百遍,让我至今没初恋
提起数学,很多人爱之恨之,一言难尽.数学总被人贴上严肃和枯燥的标签,其实任何事物都不能将其绝对化,数学也是如此,数学也有其美的一方面,只是缺少了发现数学美的眼睛.数学和音乐当然也有交叉点,这些歌曲你都 ...
- HashMap 虐我千百遍,我待 HashMap 为初恋
HashMap.HashTable.ConcurrentHashMap 这一套感觉今年面试都不怎么问了,场景题越来越多,求职的门槛越来越高,这种常见的面试题问出来大概率就是要送波分了. 1. 讲讲 H ...
- 【算法虐我千百遍,我待ACM如初恋】Hail Algorithm,Hallelujah ACM!!
(谨向余光中先生致敬) 鼠标轻划标题上的永恒常量 有人好奇的看着你,朋友 太过熟悉的窗口,人们不知 那无垠的循环中,你的叮咛 人心中总有魔兽红警反恐撸啊撸 却不知你富有魅力的救赎 三百分钟即创世 何止 ...
- Maven虐我千百遍,我待Maven如初恋!
来源 | 张丰哲 jianshu.com/p/20b39ab6a88c 互联网开发,特别Java领域,可以说Maven随处可见.Maven的仓库管理.依赖管理.继承和聚合等特性为项目构建提供了一整套完 ...
最新文章
- 管道、重定向、vim文本编辑器
- sevlet实现下载文件功能
- Cmder - 在右键菜单添加Cmder Here
- 一套存储承载全场景,XSKY星辰天合发布企业级SDS V5系列
- 【博客话题】爱上Linux的N+1个理由
- Python飞机大战代码
- gif生成工具(免费)
- 基于豆瓣影评数据的文本分析系统【数据爬取+数据清洗+数据库存储+LDA主题挖掘+词云可视化】
- gigabyte计算机主板图解,技嘉主板BIOS如何设置及进入 技嘉主板BIOS设置图解教程(2)...
- 快速回复信息神器免费的有哪些,哪些工具可以快捷回复
- 电脑开启热点手机显示不可上网
- 系统封装失败遇到windows 无法分析或处理
- 训练记录番外篇(2):2022 ICPC Gran Premio de Mexico 2da Fecha
- shell 中如何输出回车符号
- 学习-定义和调用求x的n次幂的函数
- 关于“AHCI模式”解析
- dg打开软件Android,DG 文件扩展名: 它是什么以及如何打开它?
- Centos7 Yum安装MYSQL8.0详细安装步骤
- 全能成熟稳定开源分布式存储Ceph破冰之旅-上
- 迁移学习一、基本使用
热门文章
- fputc会覆盖吗_墨粉寿命和打印的文件有关系吗?
- Hadoop的搭建,VmwareWorkstation 16pro + Ubuntu18.04.1
- 【小知识】System.getProperties()获取系统环境变量
- 代码详细解析简单常用DOS命令 java会用这些就够了!
- springMVC---处理模型数据方法 *
- 文本右上角右下角添加文本
- 修改windows远程登录端口
- mysql修改密码的注意点
- 几个基本概念辨析:流敏感,路径敏感和上下文敏感
- CodeForces - 987E Petr and Permutations(树状数组+逆序对定理)