一直搞不太清楚HTTPS以及各种加密算法到底是什么意思,特写此博客记录学习心得
文章目录
Linux 网络安全
概述
两台主机的通信,其实本质是进程的跨主机通信。
进程通常工作在用户空间,是一个具体的应用的静态代码的动态表现,是程序文件+数据的动态表示。
通信协议大体上可以分为两层:
- 上半段位于用户空间的叫做资源子网
- 下半段位于内核空间的叫做通信子网。
所以通信子网主要考虑的是报文如何安全无误的送到对端 ,资源子网考虑的是 数据如何组织与交换,数据该如何表示,该如何完成双方在应用层的交换。
在Linux内核中,我们可以通过编译内核来决定是否启用哪一个协议,也就是说,通信子网的协议是在内核中通过代码实现的
而在用户空间的资源子网,比如应用层的很多协议,如http协议,FTP协议,SSH协议等,这些协议具体由我们安装的软件来实现客户端或者服务端。比如httpd可以作为http协议的服务端,浏览器作为http的客户端实现。
所以用户空间 是靠一个一个的具体的能够进行网络通信的程序来实现,这些程序启动为进程之后,可以向内核发起系统调用,调用内核的通信子网,来完成数据报文封装和网络通信。
同一主机内的进程间通信:
IPC:消息队列,共享内存(shm),信号量(semaphore)
不同主机的进程间通信:
socket(ip+port,端口是用来标识进程地址,因为一个主机上多个进程对外提供通信。port用来标识一个主机上不同进程的所拥有的地址,由于port是内核的传输层协议提供,所以进程启动时,要想通过某个port来获取一个地址用来通信,所以要向内核申请注册某端口,申请成功后,该端口被该进程独占。)
由于是两个进程互相通信,所以是一对socket进行通信。
客户端往往是随机申请一个较大的端口,而服务端则是需要进程一直启动以便随时监听请求,是一些全默认端口(如http 80端口,https 443端口等),半默认端口(mysql 3306端口等)
传统上,tcp/ip通信过程中,具体的应用层协议,绝大多数都没有自己实现加密解密功能。
所以,直接使用http协议 是无法保证传输安全,任何一个环节都可以完整的看到传输的数据实体。
所以如果一方能够将数据编码为 其他人看不懂的格式,而对端能看懂即可。
所以客户端和服务端需要提供加密解密的功能,而一般的即时通信工具如QQ,则提供了加密解密功能,但是普通的http服务 或者web服务,是没有此类功能。
后来,网景公司设计了一种可以被调用的公共模块,将这个模块(库)放在了应用层和传输层之间(算是半层),任何本身不具备加解密功能的程序如果在开发时调用了这个库,则可以使用加密功能,如果不调用,则还是使用明文传输。这个半层,则叫做SSL(安全套接字层 Secure Sockets Layer)。
SSL只是一个协议,程序需要遵循这个规范,才叫做一种实现(OpenSSL,JSSE)。
任何程序要想实现加解密功能,其实没必要自己写一遍,可以调用SSL库提供的加解密功能,所以这个库有两个功能:提供基本的加解密功能,加密解密后基于网络通信的方式完成密钥的分发。
HTTPS:HTTP协议调用了SSL库就变成了HTTPS协议。
网络通信安全的目标:
- 保密性:confidentiality ----数据不被别人看懂
- 完整性:integrity----数据不丢失
- 可用性:availability ---- 合法的对方可以解密
网络攻击类型:
- 威胁保密性的攻击:
- 窃听(如果没有加密,就会被窃取数据)
- 通信量分析(即便数据加密了,但是可以监视通信量,获取其他的一些数据比如通信目标,目的地址等)
- 威胁完整性的攻击:
- 更改modification(截获报文后,更改数据内容)
- 伪装masquerade(伪装为一个身份,去发起一次通信)
- 重放replay(将报文截获后,多次发送)
- 否认(有一方拒不承认 曾经的通信行为)
- 威胁到可用性的攻击:
- 拒绝服务Dos— deny of service攻击(攻击导致服务不可用了,比如用非正常访问占用你的系统资源)
解决方案
为了达到安全目标,主要采取了两个层面的措施:
- 技术:加密解密
- 服务:为了抵御攻击的服务,或者为了实现安全目标而特地设计的服务
加密和解密
所谓加密,就是使用某种算法,将明文转换为密文
解密,就是使用同样的机制,将密文还原。
而加密算法基本都是公开的,所以加密本身不能依赖于算法,而需要依赖于第三者(密钥的复杂度)。假设在不使用密钥的情况下,无法暴力的还原密文。
而密钥如何安全的送到对端,就显得异常重要。
传统加密
替代加密
置换加密
现代加密
现代块加密方法:将数据切割为大小固定的块,每一块单独加密,后一块和前一块有某种关系(通常有置换单元,替换单元,异或单元,位移要素,对换要素等),后一块的加密结果与前一块做异或,将异或的结果发到对端,所以攻击者只得到其中一块的话而没有前一块,也无法还原为明文,还可以基于链式机制,对数据做了特殊运算,使得数据被窃取时必须完整拿到所有数据,才能拿到完整的密文,进而才可能还原为明文。
加密算法和协议
对称加密
公钥加密(非对称)
单向加密
密钥交换协议:DH算法,ECDH(椭圆曲线DH),公钥加密RSA算法
安全服务
认证机制
访问控制
对于Linux来说,实现了上述的加密算法协议和服务的工具有两组:
- OpenSSL (ssl协议)
- GPG(pgp协议)
密码学知识
OpenSSL 由三部分组成:
- 加密解密库(libencript 实现加密解密功能)
- 实现ssl功能库(libssl 用于实现ssl 安全通信的库,如果程序不使用ssl通信,只加密解密的话,则调用上限的libencript 库即可。 libencript 这个库主要是面向开发者,写程序中调用这些库函数)
- openssl(多用途命令行工具,模拟ssl通信,实现加密解密等)
大多数Linux的服务,如果使用SSL功能,都是调用OpenSSL的库(某大学研究生,将知名的安全算法全部实现了一遍)。所以OpenSSL 是一个基础设施,所以必须保证安全,由一个开源组织维护。
加密算法的工作模式:
对称加密:
加密和解密使用同一个密钥,但是加密解密算法可以不同。
- DES : Data Encryption Standard 加密端,使用64位明文产生64位密文,解密端则相反,说明一个数据块为8字节,使用56位密钥,DES 使用16个迭代块基于迭代方式加密,是一个现代的加密算法—DES 不够安全,容易破解
- 3DES: triple DES : 3个数量级的DES 安全性
- AES : Advances Encryption Standard: AES 支持多种变长密钥,如128位,192位,256位密钥,384位密钥,所以称为AES128,AES192等,大大提高了安全性
- Blowfish
- Twofish
- IDEA
- RC6
- CAST5(后面几个都是商业加密算法)
对称加密特性:
加密解密都是同一个密钥
将原始数据分割为固定大小块,逐个加密
缺陷:
密钥过多
密钥分发难(比如使用DH算法,用于密钥交换)
非对称加密(公钥加密):
密钥成对出现,分为公钥和与之配对的私钥。
公钥:从私钥中提取产生,公开给所有人,public key
私钥:给所有人留存,通过某种工具和算法创建。必须保证私密性,secret key
特点:加密解密所需要的密钥互为相反,即加密用公钥,解密则用私钥;如果加密用私钥,则解密用公钥。
用途:
- 数字签名(接收方确认发送方身份)
- 密钥交换(发送方用对方的公钥,加密一个对称密钥,并发送给对方,以实现密钥交换)
- 数据加密(很少用,因为密钥交换完毕后,https中使用其他的对称加密密钥来加密,而公钥和私钥只用来签名和进行密钥交换)
缺点:
效率比对称加密慢得多,比对称加密慢3个数量级。所以真正的数据传输不使用非对称加密。
如果只是用于身份认证或者数据完整性,方法则是提取数据的特征码,也叫作数字指纹(使用MD5或者sha256),然后使用私钥签名,最终接收方可以比对这个特征码来确认数据是否完整。
工作模式:
公钥和私钥都可以用来加密和解密,所以有两种工作方式。
方式1:公钥持有者(public),使用公钥加密数据发送出去,由于只能被配对的私钥解密,可以保证这段数据只能被私钥持有者解密,其他人拿到之后是无法破解的。(所以,公钥的主要作用是加密,保证数据只能被对端识别)
方式2:私钥