深入浅出HTTPS:从原理到实战
2020-09-10 18:48:09 1 举报
AI智能生成
深入学习HTTPS
作者其他创作
大纲/内容
第一章:HTTP介绍
解决问题的办法:使用HTTPS
主要内容
了解Web、HTTP的基本概念,以及两者之间的关系
了解网络模型的基本框架,以及HTTP在TCP/IP中的定位、角色、职责
分析HTTPS不安全的根本原因,理解Web应用安全的范畴,HTTPS安全只是其中的一部分
1.1 什么是Web
理解
真正的数据传输由其他网络层处理
HTTP
误区:认为HTTP负责数据传输
正解:负责数据请求和响应
Web的中文名称是万维网WWW
Web的组成
HTTP(超文本传输协议)
客户端和服务器的数据传输和解析
信息的载体
URL
URL规则定义
http://www.example.com:80/index.html
80是HTTP协议的默认端口(可以省略不输入)
/index.html表示服务器在/根目录下有一个index.html资源
www.example.com表示服务器地址
HTML(超文本)
客户端(浏览器)将HTML页面转换为用户能理解的内容
文字、图片和视频等资源
引入CSS和JavaScript语言
CSS
丰富和精确地表现HTML内容,本质上是HTML语言的一部分
JavaScript(客户端脚本语言)
控制浏览器解析
1.2 理解HTTP
HTTP的定义
RFC 2616规范
历史版本
...
HTTP/0.9、HTTP/1.0
HTTP/1.1
从性能和标准化的维度做了些优化
下一代的HTTP标准是HTTP/2.0
HTTP的模型(B/S模型、客户端/服务器)
客户端
Chrome、Firefox等
命令行工具:Linux上的Curl工具
服务器
Nginx 、Apache
服务端提供HTTP服务
定义了服务器的地址的域名
一台主机绑定域名且用来安装服务器软件
开发者使用开发语言(比如Python、PHP)编写HTML页面,提供HTTP应用层服务
HTTP语义
HTTP消息
核心:HTTP头部(HTTP Header)
请求行或响应行
HTML实体
HTTP语义信息
HTTP头部
HTTP请求结构
HTTP响应结构
Accept-Encoding:gzip
浏览器支持的数据压缩算法
Host:www.example.com
请求行
(GET/POST/PUT...)/index.html HTTP/1.1
方法
GET/POST/PUT...
互联网资源的地址
HTTP版本
响应行
HTTP/1.1 200 OK
状态码
信息提示符
HTTP的特点
客户端/服务器模型
客户端和服务器通过网络交换信息
HTTP是无状态的
随着TCP/IP连接的关闭结束:每次请求完成后,不会在客户端和服务器上保存任何的信息
改进
引进Cookie和Session技术
会话保持
HTTP是跨平台的
HTTP用途很广泛
Web主要使用HTTP进行传输数据
HTTP是一个数据载体
1.3 网络模型
HTTP是应用层协议,是TCP/IP的一部分
TCP/IP概述(协议族)
协议含义:通信双方需要遵循相同的规则,才能互相协作
TCP/IP层次结构
层级介绍
应用层(虚拟)
解释应用层数据的含义,使人类理解数据的含义
协议:HTTP、FTP、邮件协议
应用层协议软件:开发者开发的软件
传输层(虚拟)
通过端口来区分服务,通过IP地址和端口号构建一条传输通道
服务器端口号默认是80
客户端的端口是随机产生的
类型
TCP
HTTP构建在TCP之上
UDP
优点:性能高,减少了很多开销
缺点:不能保证数据正确传达
网络层(虚拟)
IP协议
链路层(实体)
光纤、网卡等设备
封包/拆包机制
客户端封包
服务器拆包
Socket和TCP
TCP/IP需要通过Socket接口提供自身的能力
1.4 协议安全分析
互联网应用安全
主:HTTP本身的安全问题
Web应用安全问题
安全问题举例/中间人攻击
无线WiFi网络的攻击(被动攻击)
垃圾广告攻击(主动攻击)
协议不安全的根本原因
数据没有加密
HTTP本身传递的是明文
无法验证身份
在HTTP标准中,没有校验对端身份的标准
代理服务器
网关服务器
丰富和加速HTTP网站
数据易篡改
1.5 Web应用安全
浏览器、HTML和JavaScript
互联网早期
互联网中期
目前的互联网
HTML5标准是下一代HTML标准/拥有了更多的设备控制能力,会进一步导致安全问题
W3C
Web技术的标准
HTML标准
DOM标准
CSS标准
ECMAScript标准
浏览器厂商或者服务器厂商完成
第三章:收费章节
深入浅出HTTPS:从原理到实战
前言
学习HTTPS有四个关键步骤
1.密码学
2.OpenSSL
3.TLS/SSL
4.HTTPS
作者写书前的思考点
本书的读者对象是谁?
如何让他们看明白本书?
如何系统化地把HTTPS讲清楚?
书籍的内容是偏理论、实战还是两者兼而有之?
如何组织书的目录结构?
章节的排序依据是什么?
为了更好地讲清楚,自己还要学习哪些知识?
互联网安全核心
密码学算法(TLS/SSL)
适读人群
Web开发者,包括前、后端开发人员
网站运维人员
Web系统架构师
任何想了解密码学、OpenSSL、HTTPS知识的人
安全领域的开发者
书本示例包含
PHP代码片段
Nginx服务器配置
OpenSSL命令行
Wireshark pcap文件
写作基调
https://github.com/ywdblog/httpsbook
第二章:密码学
HTTPS本质上就是对密码学算法的组合/主要内容
密码学的本质,核心目标
基础的密码学算法,比如随机数、Hash算法
经典的密码学算法,比如对称加密算法、公开密钥算法、MAC算法
密码学算法安全性和性能,影响安全和性能非常关键的因素就是密钥
使用OpenSSL工具和PHP语言演示各类算法的使用
2.1 对于密码学的认知
基本认识
密码学是科学
设计密码学算法需要具备深厚的数学知识
密码学理论是公开的
密码学算法是相对安全的
现阶段安全的密码学算法,未来可能就是不安全的了
密码学攻击方法是多样化的
获取密钥
错误地使用密码学算法从而出现一些安全漏洞
密码学应用标准很重要
开发者必须掌握应用标准
不具备很强的数学知识也能掌握密码学
明白特定密码学算法解决了何种问题
根据标准正确地使用密码学算法
解决特定问题的密码学算法
HTTPS
是协议而非算法,是对多种密码学算法的工程应用
安全工具:SSH、Shadowsocks
密码学的四个目标
消息验证码(MAC)算法保证完整性
机密性(隐私性)
对称加密算法和公开密钥算法都能够保证机密性
完整性
确保接收到的数据是原始数据
知道数据是否被中间人篡改
身份验证
通信双方必须确保对端就是要通信的对象
数字签名技术确认身份
不可抵赖性
数字签名技术能够避免抵赖
OpenSSL
OpenSSL命令行也是不断迭代的,尽量使用最新版本,这样安全性和性能更有保障
包括了底层密码库和命令行工具
学习OpenSSL命令行困难的因素
OpenSSL命令行功能非常强大,有很多的子命令和参数,如果不理解密码学算法,根本无法理解子命令和参数的含义,这是难学习的根本原因,也说明学习OpenSSL之前必须先掌握密码学算法
不同版本的OpenSSL命令行工具在使用的时候有一些差别,同样一条命令,读者会发现在特定版本下可能无法正确运行
OpenSSL命令行的帮助手册和文档描写得不是很通俗,很难进行系统的学习
完成同样一个操作,OpenSSL命令行有许多方法实现,这可能会干扰读者的学习
本章应用的OpenSSL命令行运行环境
Ubuntu 14.04.5 LTS系统
OpenSSL 1.1.0f
查看OpenSSL版本
$ openssl version
查看所有OpenSSL支持的命令
$ openssl help
获取算法的帮助信息
$ openssl rsa --help
了解算法的详细使用信息
man rsa
构建特定版本的命令行工具
2.2 随机数
随机数的类型
特性
效率
随机性
不可预测性
不可重现性
不管经过多长时间,不会产生完全相同的随机数
随机数的工作原理
真正的随机数生成器TRNG
内部状态的数值来自外部设备,称为熵
动态的时间
变化的温度
声音的变化
鼠标位置
伪随机数生成器PRNG
内部状态的数值来自于模拟的数值,称为种子
常见的随机数生成器
使用外部熵生成随机数
伪随机数生成器算法
大部分开发语言都有类库提供伪随机数生成算法
密码学随机数生成算法
密码学算法中的随机数
随机数常见用途
2.3 Hash算法
密码学中的基础算法
随机数生成器算法
密码学Hash算法
加密基元
作用:构建更多的密码学算法、协议、应用程序
类比理解:类似于房屋的内部材料(砖头、水泥)
普通Hash算法和密码学Hash算法
普通Hash算法
Hash表(散列表)
根据键值快速找到数据
密码学Hash算法有Hash算法的所有特性
从安全的角度考虑,密码学Hash算法还有其他的一些特性
密码学Hash算法的特性
公式描述:摘要/散列值/指纹(输出值)=hash(消息)(输入值)
hash表示特定的Hash算法
消息就是输入值
别名
摘要算法、单向散列函数
主要特性
相同的消息总是能得到同样的摘要值
运算非常快速
单向性/摘要值是不可逆的
通过摘要值很难逆向计算出原始消息
摘要值随原始消息改变而改变
很难找出两个不同的消息,并且它们的摘要值是相同的
Hash算法的用途
文件比较
不管多大的文件,摘要值的计算非常快速
不同的文件,内容即使99%相同,对应的摘要值也是不同的
身份校验
这个方案存在安全风险
系统具体如何校验用户的权限呢?
用户输入用户名和口令登录微博或者微信
系统使用Hash算法计算出口令的摘要值
系统使用用户名和摘要值在数据库表中进行检索,一旦匹配到就说明该用户输入的口令是正确的
采用Hash算法的原因
什么是安全的密码学Hash算法
强抗碰撞性
弱抗碰撞性
单向性
密码学Hash算法的分类
MD5算法
摘要值长度固定是128比特
证明已经不安全
违反了强抗碰撞性原则
理论上经过2 80 次运算就能产生碰撞,实际上只要经过2 63 次运算就能破坏强抗碰撞性
SHA族类算法
SHA-1
长度固定是160比特
证明是不安全
实际使用要构造出碰撞还是非常困难
SHA-2
建议使用的Hash算法,截至目前是安全的
四种算法
SHA-256
长度256比特
SHA-512
长度512比特
SHA-224
长度224比特
SHA-384
长度384比特
SHA-3
在设计上和SHA-2完全不同的算法
SHA3-256、SHA3-512、SHA3-224、SHA3-384
大部分算法完成的功能是单一的,很少有某个算法能够解决密码学中的所有问题
2.4 对称加密算法
主要的数据加密的算法
对称加密算法
公式简单表述
密文=E(明文,算法,密钥)明文=D(密文,算法,密钥
两种类型
块密码算法
span style=\
非对称加密算法
流密码算法
XOR运算(异或操作)
流密码算法的工作原理:以RC4流密码算法为例,算法内部生成了一个伪随机的密钥流
加密解密:XOR运算
一次性密码本原理
明文与同样长度的序列进行XOR运算得到密文
密文与加密使用的序列再进行XOR运算就会得到原始明文
一次性密钥本的关键
密钥每次必须不一样,否则同一个明文和密钥就会获得相同的内容
一次性密钥本是无法破解的,原因就在于破解者无法确认破解的明文就是原始明文
密钥流的特点
密钥流的长度和密钥长度是一样的
密钥流是一个伪随机数,是不可预测的
生成伪随机数都需要一个种子(seed),种子就是RC4算法的密钥,基于同样一个密钥(或者称为种子),加密者和解密者能够获取相同的密钥流
ECB模式
最简单的一种迭代模式、存在安全问题的,一般不建议使用
加密过程
解密过程
CBC模式
解决了ECB模式的安全问题
缺点:使用起来很烦琐,应用不当,很容易出现问题
注意事项
CTR模式
密钥流不断递增,叫作计数器模式
迭代模式对比
填充标准
填充机制
明文长度必须是分组长度的倍数,如果不是倍数,必须有一种填充的机制,填充某些数据保证明文长度是分组长度的倍数
PKCS#7标准
PKCS#5
标准的好处
约定俗成
标准代表严谨,能够成为标准,必然是经过充分验证的,可以安全使用
安全角度
初始化向量应该是随机的,不容易预测的
推荐使用随机数生成器生成初始化向量
初始化向量长度等同于分组长度
对称加密算法实践
OpenSSL命令行应用AES算法
主要使用enc子命令
$ openssl enc des3 等价 $ openssl des3
命令显示系统支持的加密算法
$ openssl list -cipher-algorithms
简介AES-256-CBC的概念
加密操作
最终输出
介绍相关参数
-in表示从文件中读出明文内容
-out表示将加密内容保存到某个文件中
-aes-256-cbc表示加密算法和标准
-p参数是打印本次加密过程中salt、密钥、初始化向量的值
通过OpenSSL命令行显式地输入初始化向量、密钥
-iv表示初始化向量,-K表示密钥,密钥长度和初始化向量长度如果输入错误,OpenSSL命令行会报错
PHP语言应用AES算法(略)
总结
1.连续对数据流进行运算的一种算法2.每次处理的数据流大小一般是一字节3.可以并行处理,运算速度非常快4.目前RC4已经被证明是不安全的,建议实用块密码算法
2.5 消息验证码
与Hash算法对比
Hash算法:完整性校验,不能避免消息被篡改
消息验证码算法:避免消息被篡改
消息验证码算法的特点
证明消息没有被篡改,这和Hash算法类似
消息是正确的发送者发送的,也就是说消息是经过验证的
模型
MAC值 = mac(消息,密钥)
MAC处理流程
MAC算法的种类
两种形式
CBC-MAC算法
HMAC算法
在HTTP中应用最多的MAC算法是HMAC算法
加密算法不能提供完整性
对称加密算法可以保证消息的机密性,MAC算法可以保证消息的完整性
AD加密模式
Encrypt-and-MAC (E&M)
对消息分别进行加密运算和MAC运算,然后将两个运算结果结合起来发送给接收方
MAC-then-Encrypt (MtE)
先对消息进行MAC计算,然后将消息和MAC值组合在一起再进行加密,最终的加密值再发送给接收方
Encrypt-then-MAC (EtM)
先对消息进行加密得到密文,然后对密文再计算MAC值,最终将密文和MAC值组合在一起再发送给接收方
AEAD加密模式
CCM模式
在HTTPS中使用得比较少
GCM模式
ChaCha20-Poly1305
结合加密算法一起使用
这三种模式使用者必须分别处理,一旦处理不当,就可能会存在安全风险
2.6 公开密钥算法(非对称加密算法)
公开密钥算法和对称加密算法的区别
功能不一样
公开密钥算法:加密解密、密钥协商、数字签名
对称加密算法:加密和解密
密钥是一对
对称加密算法:密钥是一串数字,加密者和解密者使用同样的一个密钥
公开密钥算法:密钥是一对,分别是公钥(public key)和私钥(private key),一般私钥由密钥对的生成方(比如服务器端)持有,避免泄露,而公钥任何人都可以持有
运算速度很慢
RSA算法运算非常缓慢
一般进行密钥协商或者数字签名、这两者运算的数据相对较小
理解RSA的内部结构
PKCS标准
RSA加密算法的应用场景
单步加密/客户端要向服务器端发送自己的身份证号
双向加密/用户要查询账户(身份证)下还有多少余额
非常重要的一个加密基元
0 条评论
回复 删除
下一页