前言
早期互联网数据传输是基于TCP/IP模型完成数据交换,其各层对传输的数据包进行各协议的封装,从数据的发送方到接收方进行的数据交换都是基于明文传输。在传输的过程中数据的可以被中间人进行拦截或抓取,威胁了数据的保密性(窃听、通信量分析)、数据的完整性(更改、伪装、重放、否认)、数据的可用性攻击(拒绝服务DOS及DDOS)。为了了达到安全,出现了技术的解决方案:加密和解密来抵御攻击。
加密和解密算法和协议
1、对称加密:
特性:
- 1、加密和解密使用同一密钥,但双方加密算法可以不同
- 2、将原始数据分割成固定大小块,逐个进行加密
- 3、加解密速度比较快
缺点:
- 1、密钥过多
- 2、密钥分发困难
用途:
- 常见用于数据传输过程中的数据加密,
常见算法:
DES
: Data ,基于64位明文产生64个密文,或者64位密文产生64位明文3DES
: triple DESAES
: advanced Encryption standard,采用128、192、256、384位加密机制Blowfish
Twofish
IDEA
RC16
CAST5
2、非对称加密(公钥加密)
特性:
- 1、密钥分为公钥和私钥,密码都是成对出现。
- 2、私钥可以解公钥加密的数据,公钥也可以解私钥加密的数据
- 3、公钥从私钥中提取产生,可以公开给所有人,称之为Public Key
- 4、私钥通过工具创建,使用者自己留存,必须保证其私密性,称之为Secret Key
缺点
- 加解密速度慢,一般比对称加密要慢3个量级(一个量级是10倍)
- 中间人攻击
用途
- 发送方使用公钥加密一个对称密钥,并发送给对方
- 主要用于让接收方确认发送方的身份
- 1、数字签名
- 2、密钥交换
- 3、数据加密
数字签名及密钥交换过程说明:
- 1、发送方使用单向加密算法计算数据的特征码,用其私钥加密特征码,并附加在数据后面,
- 2、发送方再使用对称加密算法生成密钥,加密整个数据,并拿到对方的公钥,加密对称加密的密码,发送给对方
- 3、对方收到后使用自己的私钥解密,拿到对称加密算法的密码,再使用密码解密整个数据。
身份验证机制的实现
:发送方使用自己的私钥加密数据后,接收方拿对方发布的公钥解密其数据,这个过程被称之为身份验证
密钥交换机制的实现
: 发送方使用对方的公钥加密其密码,接收方使用自己的私钥解密后可以得到其密码,这个过程被称之为密钥交换
常见算法
- RSA : 能同时实现加密解密
- DSS : Digital signarure standard
- DSA : 只能实现签名,不能实现加解密
3、单向加密
特性:
- 1、定长输出
- 2、雪崩效应
- 3、只加密不能解密
用途:
- 实现数据的完整性验证
常见算法:
- MD5 : message digest5,固定128位的定长输出
- sha1 : secure hash algorithm ,固定160位的定长输出
- sha224,sha256,sha384,sha512
密钥交换机制(IKE ,Internet Key Exchange)
实现算法:
- RSA
- ECDH(随圆曲线DH)
- ECDHE(临时随圆曲线DH)
- 公钥加密
- DH(deffie-hellman)
DH交换密钥的实现原理
A: p,g (生成两个大数) B: p,g(生成两个大数) A: x(生成一个随机数) --> p^x%g ---->(发送给B) B: y(生成一个随机数) -->p^y%g ----> (发送给A) A:(p^y%g)^x == p^yx%g B: (p^x%g) ^y == p^xy%g(算得的密码都一样)
为什么会有CA机构的出现
由于基于公钥和私钥机制进行密钥交换时,会有中间人攻击的情况发生。故我们需要有一个第三方机构帮忙认证证书的真实性,不会被第三方利用。这个情况下,出现了签证机构,即CA。
CA颁发证书的机制
- 1、客户生成相应的私钥,并提取公钥
- 2、向CA机构发送申请信息,其中需要提供主体名称、主体公钥、主体的唯一标识,生成一个签署请求文件。
- 3、CA机构对其提供的请求文件提取特征码,使用自己的私钥对特征码签名,生成证书(证书中包含信息请见以下)
PKI(Public infrastructure,公钥基础设施)
四个组件组成
- 签证机构 : CA
- 注册机构 : RA
- 证书吊销列表 : CRL
- 证书存取库 : CB
证书的基本格式(X.509标准)
- 1、证书序列号
- 2、序列号
- 3、签名算法ID
- 4、发行者名称
- 5、有效期限
- 6、主体名称
- 7、主体公钥
- 8、发行者的唯一标识
- 9、主体的唯一标识
- 10、扩展
- 11、发行者的签名
加密通信的实现协议
SSL (Secure socket layer)
由网景公司研发,SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol):它建立在可选的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol),它建立在SSL记录协议之上, 用于在实际的数据传输之前,通讯双方进行身份认证、协商加密算法、交换加密密钥等
- V1.0
- V1.2
- V3.0
协议版本
TLS (Transport layer security)
TLS是开源SSL的实现,由IETF公司于1999年发布,其支持多种算法。TLS彩分层设计:
- 协议版本:
- V1.0
- V1.1
- V1.2(目前主流版本)
- V1.3
- 最底层:基础算法原语的实现,AES,RSA,MD5
- 向上一层: 各种算法的实现
- 再向上一层: 组合算法实现的半成品
再向上:用于各种组件拼装而成的各种成品密码学协议软件
Handshake握手过程(无需验证客户端证书)
动作 | 发送方 | |
---|---|---|
Client hello | Client | |
(2)Server Hello | Server | |
(3)Certificate | Server | |
(4)Server hello done | Server | |
(5)Client Key Exchange | Client | |
(6)Change cipher spec | Client | |
(7)Finished | Client | |
(8)Change cipher spec | Server | |
(9)Finished | Server |
- 1、TLS客户端通过Client Hello消息发送所支持的TLS版本、加密算法、压缩算法、密钥交换算法、MAC算法等信息发送给TLS服务端
- 2、TLS服务端确认本次通信采用TLS版本加密通信,并通过Server Hello消息通知SSL客户端,并将自己的公钥信息的数字证书发送给TLS客户端
- 3、服务端发送Server hello Done消息,通知客户端版本和加密套件协商结束,开妈进行密钥交换
- 4、客户端验证服务端的证书合法性后,利用证书中的公钥加密客户端随机生成的premaster secret(随机数字做为密码),发送给服务端
- 5、客户端发送Change cipher spec消息,通知服务端后续采用协议商好密钥和加密方法进行加密和MAC计算
- 6、客户端计算已交互的所有握手信息(除Change cipher spec消息)进行Hash值计算,并使用协商好的密钥进行加密Hash值,并通过Finished消息发送给服务器,服务端利用同样的方法计算已交互的握手消息的Hash值,并与解密的Hash值比较,如果二者相同,则证明密钥和加密套件协商成功
- 7、同样服务端也会发送Change cipher spec消息,通知客户端后续报文采用协商好的密码和加密套件处理Hash值,客户端利用同样的方法计算已交互的握手消息的Hash值,并与之对比,如果相同则证明密钥和套件协商成功
Handshake握手过程(验证客户端的证书过程)
动作 | 发送方 | |
---|---|---|
Client hello | Client | |
(2)Server Hello | Server | |
(3)Certificate | Server | |
(4)Certificate Request | Server | |
(5)Server hello done | Server | |
(6)Certificate | Client | |
(7)Client Key Exchange | Client | |
(8)Certificate Verify | Client | |
(9)Change cipher spec | Client | |
(10)Finished | Client | |
(11)Change cipher spec | Server | |
(12)Finished | Server |
客户端的身份验证是可选的, 由服务器决定是否验证客户端的身份(银行网银类似是需要验证客户端的身份)
- 1、服务器发送Certficate Requset消息,请求客户端的证书
- 2、客户端通过Certificate消息将携带自己的证书发送给服务端
- 3、服务端验证该证书的合法性
- 4、客户端计算已交互的握手信息、主密钥的hash值,利用自己的私钥对其进行加密,发送给服务端
- 5、服务端计算已交互的握手信息,主密钥的hash值,利用客户端的公钥解密后,进行hash值对比,如果相同则客户端身份验证成功
说明:change cipher spec消息属于SSL密码变化协议,其他握手过程交互的消息均属于SSL握手协议,统称为SSL握手消息。计算Hash值,指的是利用Hash算法(MD5或SHA)将任意长度的数据转换为固定长度的数据
OpenSSL开源软件
1、简介
Openssl是开源软件,各应用程序可以使用openssl进行安全通讯,避免窃听、同时确认另一端连线者的身份,openssl被广泛应用在网页服务器之上。其是C语言所写,实现了基本的加密功能,也是SSL/TLS协议的应用实现。此软件是以Eric Young以及Tim Hudson两人所写的SSLeay的分支,于1998年12月发布第一个版本
2、Openssl的版本
- V0.91c (1998年12月发布)
- V1.0.1 : 支持TLS v1.2(2012年3月发布)
- V1.0.2 (2015年1月发布)
3、OpenSSL的组成部分:
- 加密解密库:Libencrypt,主要开发者使用
- Libssl : 实现SSL安全通信机制的库
- OpenSSL工具:多用途命令行工具
openssl加密工具
对称加密工具:openssl enc
- 加密:openssl enc -e -des3 -a -salt -in fstab -out fstab.cipher
解密 :openssl enc -d -des3 -a -salt -out fstab -in fstab.cipher
-e : 加密 -d : 解密 -a : 以base64编码进行输出 -salt : 加盐 -in :指定从那个文件读入 -out : 输出至那个文件
单向加密工具:openssl dgst
openssl dgst -md5 fstab
-md5 :指定算法
生成用户密码:openssl passwd
openssl passwd -1 -salt 12345678
-1 : 指定加密算法 -salt : 加盐,并且为123456
生成随机数:openssl rand
- openssl rand -base64 10 (base64编码格式)
- openssl rand -hex 10 (16进制编码格式)
- openssl passwd -1 -salt $(openssl rand -hex 4)
生成私钥:openssl genrsa
- openssl genrsa 1024 > /tmp/mykey.private
- openssl genrsa 1024 -out /tmp/mykey.private 1024
- (umask 077;openssl genrsa -out /tmp/mykey.private 1024)
提取公钥:openssl rsa
- openssl rsa -in /PATH/FROM/private.key -pubout
- openssl rsa -in /PATH/FROM/private.key -pubout -out pub.key
查看证书:opensll x509
- openssl x509 -in httpd.crt -noout -serial -subject :只查看序列号和subject
Openssl CA的工作目录
- /etc/pki/CA
Openssl配置文件
- /etc/pki/tls/openssl.cnf
- $dir/certs : 签发的证书存放位置
- $dir/crl : 吊销的证书存放位置
- $dir/index.txt : 证书的索引信息
- $dir/serial : 索引序列号
- $dir/private/cakey.pem : CA自己的私钥
- $dir/cacert.pem : CA公钥位置
- [req] : 此ID中定义了签署证书的属性
构建CA及签发证书的步骤
########自建CA######## 1、生成私钥 (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096) 2、生成自签证书 openssl req -x509 -new -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655 3、为CA提供所需的目录及文件 mkdir -pv /etc/pki/CA/{certs,crl,newcerts} 4、建立证书索引序列号 echo 01 > /etc/pki/CA/serial ########客户端生成私钥及生成签发证书请求######## 1、到客户端相应的目录中,生成私钥 mkdir /etc/httpd/ssl (umask 077; openssl genrsa -out httpd.key 2048) 2、生成签署请求文件(实为导出公钥信息) openssl req -new -key httpd.key -out httpd.csr -days 365 ########服务器端签署证书######## 1、openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365 #######拷贝签署的文件至客户端指定目录####### 1、cp /tmp/httpd/csr /etc/httpd/ssl
CA吊销证书
1、客户端获取要吊销证书的serial 2、CA端主机执行吊销操作 openssl ca -revoke /etc/pki/CA/newcert/SERIAL_ID(证书的真正序列号) 3、生成吊销证书的吊销编号(只是第一次吊销证书时执行) echo 01 > /etc/pki/CA/crlnumber 4、更新证书吊销列表 openssl ca -gencrl -out thisca.crl #####查看crl文件 openssl crl -in /PATH/FROM/CRL_FILE.