监听模式:打开ip和端口=套接字 等待别人来连接
为众所周知的服务--固定的端口<1024
客户端程序都是打开一个大于40000 的端口
一个主机与另外主机进程通信过程:
客户端应用层进程本身负责封装应用层的报文,包括添加应用层首部等。
不是所有进程都可以
wget就是可以网络通信的程序
都需要处理应用层的处理
封装好应用层程序向内核发起系统调用,内核负责完成通信子网功能。
封装传输层首部,网络层首部,帧首部,最后通过物理传输介质,
接受的主机就会解封数据包,解封后会根据端口将应用层报文教给应用层注册这个端口的进程。
对应的进程负责处理。比如i请求页面就会磁盘io到磁盘分区将请求页面由进程加载进来封装。
真正的封装就是编码为特定格式。比如base64格式。。
http协议
实际是需要加解密的
文本编码是没有多余的功能,流视化 可加密对方可还原
不具备加解密的http服务应该怎么办呢?
通信加密和解密
为http协议研发了可被调用的公共功能模块
以库的方式放在 在应用层和传输层之间
只要调用了这个库就是 ssl 安全套接字层
开发程序的程序员只要开发的时候调用了这个库,这个库自身可以帮我们完成加解密功能以及密钥分发功能。
大部分协议还是没有加解密的
用户输入密码会被窃取的
Http协议本身是不支持加解密的
因此http调用ssl库--->https
你会发现浏览商品都是http输入密码就变成https
现在全栈https--浏览商品也被加密了,很多运营商很流氓,分析通信功能,替换为自己的广告等、
为了避免劫持 就使用了https
增加了很多cpu压力 但是是值得的
安全的目标:
保密性,完整性,可用性
攻击类型:
但是密码如何实现密钥的传送呢? 密钥算法和协议就是为了解决 DH算法--专门交换的
Linux系统为了实现上述目标需要一些服务:
用于实现加密解蜜的库:libencrypt
实现ssl安全通信机制的库:libssl
openssl多用途命令行工具
DES 56bit密钥
AES支持 128bit 192bit 256bit密钥
密钥长度多了一倍 安全强度不止一倍为止
服务器和1000个人通信 因此需要1000个密码 因为如果使用同一个 那么a就可以看到b的数据
密钥分发--DH算法 看到你俩眉来眼去 也不知道真实的数据
公钥加密比私钥加密慢得多
完整性,可用性,保密性 一起
alice使用单项加密算法加密数据得到特征码,然后把这个特征码使用自己的私钥加密生成数字签名附加在数据后面,alice生成临时的对称密钥。并使用对称密钥加密整段数据。为了保证bib解蜜,alice机组使用bob公钥继续加密临时的对称加密密钥 附加在后面 一并发送过去
之所以使用对称加密算法是因为通信过程中如果一直使用公钥加密会造成资源浪费等。
bob私钥解蜜 得到对称加密的密码 也就是密钥交换 解蜜数据后 得到数据和特征码 用alice的公钥验证特征码的签名看是否是alice发送的 使用单项加密加密数据 和特征码比较 如果一样 说明没有被篡改
保证了保密性,完整性以及身份认证
alice和bob彼此不认识
存在中间人攻击
eve把公钥给alice假装是bob eve再伪装为alice去找bob 再把公钥给bob假装是alice 这样整个通信都会经过eve进行
bob无法验证那个人不是alice
因此这个时候需要一个机构CA 保证可靠的获取到对方的公钥 设立的第三方可信机构
bob把公钥给ca ca经过签名后把证书给bob 所以alice之后通信bob就发证书过去 alice认证证书 才会确认是bob本人
如何验证CA呢?
证书:拥有者名称,公钥,证书有效期限,ca私钥加密特征码
CA 会有自签名证书,然后发送给每一个信任他的用户。
所以alice拿到ca的证书获得她的公钥。然后验证bob证书她的签名。
如何可靠的获得ca的证书?
根ca下面有很多机构 可以传递
微软系统会内置ca证书 不用再通过互联网获取了
如果盗版系统就不一定了
bob私钥丢失了,要立即向ca申请撤销
DSA仅仅能签名
RSA可签名可加密
办理身份证去公安局(注册机构)–>但是派出所没有制作身份证的技术
谁签证?区公安局 发身份证 全国认可
吊销列表:xx公司章子已作废
证书存取库:证书签发机构的在自己的机构还有一个存储的证书 用户可以下载查看
证书组织结构:
客户端和服务器基于ssl是如何通信的呢?
say hello 以及各自加密的算法 密钥交换的算法
客户端请求要证书
服务器发送
客户端验证合法性,
但是客户端一般没有证书 比如访问淘宝 不在乎你是谁 除了网银页面
客户端选择随机数生成当成密码(第一阶段已经确定对称还是非对称加密了) 用对方的公钥加密 发给服务器
服务器用密码加密客户端请求的网页
客户端即可解蜜
然后浏览完毕
客户端请求断开连接
服务器会话断开 会话截至
双向认证 SSL 协议的具体过程
① 浏览器发送一个连接请求给安全服务器。
② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器。
③ 客户浏览器检查服务器送过来的证书是否是由自己信赖的 CA
中心所签发的。如果是,就继续执行协议;如果不是,客户浏览器就给客户一个警告消息:警告客户这个证书不是可以信赖的,询问客户是否需要继续。④ 接着客户浏览器比较证书里的消息,例如域名和公钥,与服务器刚刚发送的相关消息是否一致,如果是一致的,客户浏览器认可这个服务器的合法身份。
⑤ 服务器要求客户发送客户自己的证书。收到后,服务器验证客户的证书,如果没有通过验证,拒绝连接;如果通过验证,服务器获得用户的公钥。
⑥ 客户浏览器告诉服务器自己所能够支持的通讯对称密码方案。
⑦ 服务器从客户发送过来的密码方案中,选择一种加密程度最高的密码方案,用客户的公钥加过密后通知浏览器。
⑧ 浏览器针对这个密码方案,选择一个通话密钥,接着用服务器的公钥加过密后发送给服务器。
⑨ 服务器接收到浏览器送过来的消息,用自己的私钥解密,获得通话密钥。
⑩ 服务器、浏览器接下来的通讯都是用对称密码方案,对称密钥是加过密的。
上面所述的是双向认证 SSL 协议的具体通讯过程,这种情况要求服务器和用户双方都有证书。
加密算法如何在通信中确保安全性??两种使用机制。
1.手工机制 用户<–>用户
数据特征码取处来,私钥加密。即数字签名。bob对整个数据加密(对称加密算法-临时密钥)使用对方公钥加密临时的对称密钥然后附加在数据后面一起发送过去。 结果发送给alice alice使用私钥解蜜得到对称密钥。解蜜数据得到数字签名和数据。因此使用对方公钥解蜜特征码,解密成功验证身份成功。然后计算数据特征码对比解蜜后得到的特征码,数据完整性得到验证。然后确定是对方了就可以通信了。
以上依赖用户写的软件自行完成的
很多协议没这种功能。
出现了ssl协议
http依赖ssl/tls去完成
任何一种协议的实现都需要程序
比如http协议就是httpd
ssl实现就是openssl
三部分:
用于实现加密解蜜的库:libencrypt
实现ssl安全通信机制的库:libssl
openssl多用途命令行工具
以https为例子
客户端向网页发起请求
ssl会话详细版本:
浏览器向服务器发起clienthello请求:主要是发送自己支持的协议版本,客户端生成随机数,支持的加密算法,压缩算法
第二阶段如果服务器段需要客户端证书也发送请求,但是一般情况不需要
第三阶段
随机数用于服务器公钥加密
编码变更通知:随后信息用对方商定的密钥和算法加密
三个随机数确保临时性的
以上只是握手
后续就是根据生成的会话密钥进行通信加密了
具体的加密实现方式可以借助openssl 支持各种加密的
openssl 加密
enc加密
-e加密
-des3加密算法
-a bash64编码格式
-salt 随机数
-in加密的文件
-out输出的文件
手动加解密的认证
可以发现直接使用md5sum和openssl dgst计算的结果一样
##68 openssl未完 1:00