一、加密解密技术基础
(一) 安全的目标:
1.保密性,confidentiality
2.完整性,integrity
系统完整性,数据完整性
3.可用性,avaliability
(二) 攻击类型:
1. 威胁保密性的攻击:窃听、通信量分析
2. 威胁完整性的攻击:更改、伪装、重放、否认
3. 威胁可用性的攻击:拒绝服务(DoS)
(三) 解决方案:
技术(加密和解密)、服务(用于抵御攻击的服务以及为了实现上述目标而特地设计的安全服务)
1. 加密和解密
传统加密方法:替代加密算法、置换加密算法
现代加密方法:现代块加密方法、
2. 服务:
认证机制
访问控制机制
3. 密钥算法和协议
(1) 对称加密:加密和解密使用同一个密钥
算法:
DES:Data Encryption Standard
3DES:Triple DES
AES:Advanced Encryption Standard(128bits,192bits,256bits,384bits)
Blowfish
Twofish
IDEA
RC6
CAST5
特性:
加密、解密使用同一个密钥
将原始数据分隔成为固定大小的块,逐个进行加密
缺陷:
密钥过多,作为服务器,要与很多客户端通信的话,就必须给每个客户端一个密钥。
密钥分发困难
(2) 公钥加密:密钥成对出现,分为公钥和与之配对的私钥
公钥:pubkey,从私钥中提取产生,可公共给所有人
私钥:secret key,通过公钥加密解密工具创建,使用者自己留存,必须保证其私密性
特点:用公钥加密的数据只能使用与之配对的私钥解密,反之亦然
用途:
数字签名:主要在于让接收方确认发送方的身份,身份认证
密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方
数据加密(比对称加密要慢3个数量级,不常用)
算法:RSA,DSA,ELGamal
DSS:Digital Signature Standard
DSA:Digital Signature Algorithm
(3) 单向加密:提取数据指纹(特征码)只能加密不能解密
特性:定长输出、雪崩效应
功能:数据完整性验证
算法:
md5:Message Digest 5,128bits
sha1:Secure Hash Algorithm 1,160bits
sha224,sha256,sha384,sha512
(4) 密钥交换:IKE(Internet Key Exchange)
二、 PKI:Public Key Infrastructure,公共基础设施
(一) 四个组件:
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库:
(二) X.509v3:定义了证书的结构以及认证协议标准
证书版本号
序列号
签名算法ID
发行者名称(CA自己的名称)
有效期限
主体名称(个人名称)
主体公钥
发行者的唯一标识(CA的唯一标识)
主体的唯一标识(个人的唯一标识)
扩展
发行者的签名
三、 SSL会话
(一)主要有三步
1. 客户端向服务器索要并验证证书;
2.双方协商生成“会话密钥”;
前两步称为握手阶段
3.双方采用“会话密钥”进行加密通信
(二) SSL Handshake Protocol,执行流程
第一阶段:ClientHello:客户端发送请求
(1) 客户端向服务器端发送支持的协议版本,比如tls 1.2
(2) 客户端生成一个随即数,用于稍后用户生成“会话密钥”
(3) 客户端发送自己支持的加密算法:比如:AES,RSA
(4) 支持的压缩算法
第二阶段:ServerHello:服务器端回应请求
(1) 确认使用的加密通信协议版本,比如tls 1.2
(2) 服务器端生成一个随机数,用于稍后生成“会话密钥”
(3) 确认使用的加密方法
(4) 服务器发送自己使用的证书
(索要客户端证书,一般不会索要,除非在特定的场景中)
第三阶段:
(1) 客户端收到服务器端回应,先验证服务器证书(发证机构、证书完整性、证书持有者、证书有效期、吊销列表),在确认无误后取出其公钥
(2) 客户端发送以下信息给服务器端
一个随机数,用于服务器公钥加密
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送
客户端握手结束通知
第四阶段:
(1) 服务器收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所用到的“会话密钥”
(2) 服务器向客户端发送如下信息
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送
服务器端握手结束通知
四、OpenSSL
(一) 组件:
1. libcrypto,ibssl主要由开发者使用
2.openssl:多用于命令行工具
(二) openssl的众多子命令:
1. 标准命令:Standard commands
enc,ca,req,genrsa
2.消息摘要命令:Message Digest commands
dgst子命令
3. 加密命令:Cipher commands
enc子命令
(三) 标准命令
1. 对称加密:
工具:openssl enc,gpg
支持的算法:3des, aes, blowfish, towfish
enc命令:
加密:~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
解密:~]# openssl enc -d -des3 -a salt -out fstab -in fstab.ciphertext
2. 单向加密
工具:openssl dgst,md5sum,sha1sum,...
dgst命令:计算特征码
~]# openssl dgst -md5 /PATH/TO/SOMEFILE
~]# md5sum /PATH/TO/SOMEFILE
只要使用的是同一个加密算法,特征码将会是一样的,只是显示的格式有所不同
3. 生成用户密码:
工具:passwd,openssl passwd
~]# openssl passwd -1 -salt SALT
4. 生成随机数
工具:openssl rand
(1) ~]# openssl rand -hex NUM
表示16进制的编码,NUM字节数
(2) ~]# openssl rand -base64 NUM
结果后面有==,是固定格式,真正使用的时候要去掉==
5. 公钥加密:
加密解密
算法:RSA,ELGamal
工具:openssl rsautl,gpg
6. 加密过程:
(1) 发送方发送数据给接收方,发送方先用单向加密算法计算出这段数据的特征码,然后用自己的私钥加密这段特征码生成数字签名,附加到这段数据后面,从而可以确保自己的身份以及数据的完整性得到验证,但是数据的保密性得不到验证。
(2) 发送方自己使用对称加密算法生成一个临时的对称密钥,用对称加密算法结合密钥加密整段数据,包括原始数据以及加密过的特征码。
(3) 为了保证接收方能够解密,然后发送方会用接收方的公钥加密刚才的临时密钥并附加到加密密码后面,把整个的数据发送给接收方。
7. 解密过程:
(1) 接收方收到这段数据之后,先用与接收方加密数据的公钥配对的私钥解密解密加密的对称密钥
(2) 得到对称密钥,然后用对称密钥解密整个这段数据
(3) 用发送方的公钥解密这段数据后面附加的特征码,能解密的话,发送方的身份得到验证
(4) 接收方用同样的对称算法计算这段数据的特征码,并与解密出来的特征码进行比较,如果相同数据完整性得到了验证。
这样的话数据的完整性、保密性以及发送方身份得到验证。
8. 数字签名
算法:RSA,DSA,ELGamal
工具:openssl rsautl,gpg
数字签名的实现方式:
身份认证过程中就依赖了数字签名,发送方用自己的私钥加密数据特征码得到的结果就是数字签名.
9. 密钥交换
算法:DH
密钥交换的实现方式:
发送方自己生成密钥,然后用对方的公钥加密这段数据,然后发送给接收方,只有接收方的私钥才能够解密,解密出来以后就可以得到发送方自己生成的密钥,然后就可以解密数据,以后双发的通信就一直使用这个密钥。
10. 生成密钥:
(1) 生成私钥:~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
使用umask 077是为了让生成的私钥只能自己读写,其他任何人都没有任何权限
把命令放到()里面是为了让命令在子shell里面运行,umask命令只对子shell有效,将不会影响当前shell的以后的操作.
NUM_BITS:位长,必须是2^n,比如512,1024,2048...
(2) 提出公钥:~]# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
11.Linux系统上的随机数生成器
(1) /dev/random:仅从熵池返回随机数,随机数用尽,阻塞
(2) /dev/urandom:从熵池返回随机数,随机数用尽,会利用软件生成伪随机数,非阻塞
伪随机数不安全
熵池中随机数的来源
硬盘IO中断时间间隔
键盘IO中断时间间隔
五、 CA:
(一) 种类
公共信任CA
私有CA
(二) 建立私有CA的工具
openssl
OpenCA
(三) CA的验证:
1.用CA的公钥解密CA的签名,能解密说明CA的来源可靠
2.用同样的加密算法加密数据取得特征码,与解密出来的特征码对比,如果一样说明证书完整性得到验证
3.检查证书的有效期限是否过期
4.验证证书主体名称与你要通信的主体的名称是否一致
5.检查证书是否被吊销
(四) openssl命令:
1. 配置文件:/etc/pki/tls/openssl.conf
2. 构建私有CA:
在确定配置为CA的服务器上生成一个自签证书,并为CA提供所需要的目录及文件即可
3. 完整步骤:
生成私钥:
~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
生成自签证书:
~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
-new:生成新证书签署请求
-x509:生成自签格式证书,专用于创建私有CA时使用
-key:生成请求时用到的私有文件路径
-out:生成的请求文件路径,如果是自签操作将直接生成签署过的证书
-days:证书的有效时长
为CA提供所需的目录及文件
~]# mkdir -v /etc/pki/CA/{certs,crl,newcerts}
如果自动生成就不用再自己手动创建
~]# touch /etc/pki/CA/{serial,index.txt}
~]# echo 01 > /etc/pki/CA/serial
4.要用到证书进行安全通信的服务器,需要向CA请求签署证书
步骤:以httpd为例
1.用到证书的主机生成私钥
~]# mkdir /etc/httpd/ssl
~]# cd /etc/httpd/ssl
~]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
2.生成证书签署请求
~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
3.将请求通过可靠方式发送给CA主机
~]# scp http.csr [email protected]:/tmp/
4.在CA主机上签署证书
~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
查看证书中的信息
~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject