加密和解密技术基础与OpenSSL
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加密和解密技术基础与OpenSSL相关的知识,希望对你有一定的参考价值。
加密和解密技术基础与OpenSSL
加密和解密技术基础(01)
1、了解
Linux service and security
OpenSSL:为网络通信提供安全及数据完整性的一种安全协议
2、一般都是C/S通信,此种通信客户端有什么特性?服务端有什么特性呢?
(1)两台主机上的通信方式?主机通信实际是进程间通信。
通信方式:socket (套接字)ip:port
客户端cip:port<-->服务器端 scip:port
(2)如何让客户知道自己的主机和端口呢?
把某些众所周知的服务应用设置成默认的端口(固定分配),http服务默认80 ,https443。
(3)服务器日常工作状态
无论有没有客户访问,服务器端都要处于监听模式(打开某个进程来监听ip和port,随时等待客户端来访)
(4)客户端、服务器端两者之间的一个简单通信流程。
客户端要打开某一网页,服务器端在收到请求以后,通过磁盘IO到磁盘的某个分区上讲用户所请求的页面文件加载到应用层进行封装,
,每层逐一封装然后发送给用户。
3.ssl(隧道中通信)
(1)ssl定义
可被调用的公共功能模块,放在了应用层和传输层之间,只有半层。任何不具备加解密功能的程序在研发时只要
调用了此库(此库能自动帮我们完成加解密功能,能帮我们完成密钥分发功能)。这个半层库就叫
ssl(Secure Sockets Layer安全的套接字层)。ssl是一种规范,一种协议。
(2)http到https
http协议(服务、应用程序)本身不具备加密、解密功能,如果调用了ssl库,就能实现其功能(成为https),从而能够完成安全通信。
4.所谓的通信安全
*保密性:confidentiality
*完整性:intergrity
*可用性:availability
5.所谓的通信不安全
*威胁保密性的攻击:窃听、通信量分析;
*威胁完整性的攻击:更改、伪装、重放、否认
*威胁可用性的攻击:拒绝服务
6.通过技术和服务来实现所谓的通信安全
(1)技术:加密和解密
(2)服务:用于抵御攻击的服务,也即是为了上述安全目标而特地设计的安全服务
7、加密、解密的过程
(1)加密的过程:
结合某种算法(比如移位) 通过网络通信机制传输给
未加密的数据(明文)——————————————>密文————————————>收信方
(2)解密的过程(收信方接受到密文后进行解密):
结合解密算法还原成
密文————————————>明文
8、秘钥参与时的加密算法
一般算法都是公开的,安全的实现并不能通过算法本身,而是要依赖参与者(秘钥)的复杂程度,
算法依赖于秘钥的复杂程度来保证安全性。
9、服务
*认证机制
*访问控制机制
10、密钥算法和协议
*对称加密
*公钥加密(非对称加密)
*单向加密
*认证协议
11、Linux系统实现上述技术、服务安全通信使用到的工具
(1)openssl(使用在ssl协议上)
OpenSSL由三部分组成:
*提供了加密解密库:libencrypto库
*libssl库
*openssl多用途命令行工具
(2)GPG(使用在pgp协议上)
12、加密算法和协议:
(1)对称加密:加密和解密使用同一个密钥;
加密算法 DES:Data Encryption Standard;
3DES:Triple DES;
AES:Advanced Encryption Standard; (128bits, 192bits, 256bits, 384bits)
Blowfish
Twofish
IDEA
RC6
CAST5
(2)对称加密的特性:
a、加密、解密使用同一个密钥;
b、将原始数据分割成为固定大小的块,逐个进行加密;
(3)缺陷:
a、密钥过多;
b、密钥分发困难;(秘钥如何安全的送达给通信方?通信方需要秘钥来解密。互联网本身是不安全的,如何在不安全的网络通信上建立一个安全通道?)
加密和解密技术基础(02)
1、公钥加密:密钥分为公钥与私钥
公钥:从私钥中提取产生;可公开给所有人;public key
私钥:通过工具创建,使用者自己留存,必须保证其私密性;secret key;
特点:用公钥加密的数据,只能使用与之配对儿的私钥解密;反之亦然;
2、公钥加密的用途:
数字签名:主要在于让接收方确认发送方的身份;(数字签名是一个过程)
密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方;
数据加密
3、数据发送的两种方式
(1)数据传送图
c
a————————————————>b
(2)传送图解释
ab之间的通信,a为发送方,b接收方。a通过b的公钥给数据加密发送给b,b公钥加密的数据只能通过b私钥来解密。
c为窃听者,a发给b的数据能被c拿到,
(3)问题:b通过自己的私钥加密一份数据给a,被c拿到,c用b的公钥可以将其解密,这样发送的方式有意义吗?
意义:a能确定数据是b发送的,b的私钥是b独有的 (通过数字签名这个过程来完成身份验证)
漏洞:c同样能用b的公钥去解密,不安全,怎么办?
漏洞解决办法?
第一步:b用单向加密计算出数据的特征码(数据特征码:只用用数据特征码才能去解密数据获得数据)
第二步:b用自己的私钥加密数据特征码,a用b的公钥去解密,能解,则说明是b发的。(身份验证)
第三步:b用对称加密去加密整段数据(包括特征码),生成了一个秘钥。然后b用a的公钥去加密这个秘钥形成一个数据段
加在特征码的后面。 (保密性)
(4)不直接使用对称加密加密数据的原因?
a和b之间要无数次的通信,数据量非常大,用对称加密性能太差。而用单项加密得到的特征码、对称加密生成的秘钥还是
用公钥加密用到的公钥、私钥本身非常小。
(5)秘钥交换?
b用对称加密的方式生成了一个秘钥,然后b再用a的公钥去加密这个秘钥。a用自己的私钥去解密自己的公钥得到秘钥,
这样的一个过程即为秘钥交换。
可靠的获取公钥
4、假如ab此前从未见过面,当b想和a通信时,c跳出来说我是a,然后c再和a说我是b,如此,ab之间的通信信息
全都会经过c,(c拿着自己的公钥和ab进行通信,将b给的信息传给a,将a给的传给b,ab还认为彼此是彼此)。
产生这种问题的原因是什么?如何解决?
(1)问题产生的原因
缺少一个可靠的获取公钥的办法
(2)解决问题
通过CA:可信的第三方机构,能保证ab能准确拿到彼此的公钥
5、单向加密:即提出数据指纹(即特征码);只能加密,不能解密;
特性:定长输出、雪崩效应;
功能:数据完整性的验证;
算法:
md5:Message Digest(消息摘要) 5(版本号), 128bits
sha1:Secure Hash Algorithm 1, 160bits
sha224, sha256, sha384, sha512
6、证书
将自己的公钥给CA进行特殊加工,通过特殊加工的公钥称之为 证书
7、PKI:Public Key Infrastructure
公钥基础设施:
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库:CB
X.509v3:定义了证书的结构以及认证协议标准
版本号
序列号
签名算法ID
发行者名称
有效期限
主体名称
主体公钥
发行者的惟一标识
主体的惟一标识
扩展
发行者的签名
8、SSL/TLS
SSL: 安全套接字层(ssl 1.0, ssl 2.0, ssl 3.0)
TLS:传输层安全 (tls 1.0, tls 1.1, tls 1.2, tls 1.3)
协议的开源实现:OpenSSL
*提供了加密解密库:libencrypto库
*libssl库
*openssl多用途命令行工具
OpenSSL使用详解
1、SSL会话主要三步:
第一步:客户端向服务器端索要并验正证书;
第二步:双方协商生成“会话密钥”;
第三步:双方采用“会话密钥”进行加密通信;
2、SSL Handshake Protocol:会话阶段(为会话的前两步)
第一阶段:ClientHello(客户端向服务器端发送加密通信请求):
向服务器端发送自己支持的协议版本,比如tls 1.2;
客户端生成一个随机数,稍后用户生成“会话密钥”
向服务器端发送自己支持的加密算法,比如AES、3DES、RSA;
向服务器端发送自己支持的压缩算法;
第二阶段:ServerHello(服务器端回应客户端)
向客户端确认使用的加密通信协议版本,比如tls 1.2;
服务器端生成一个随机数,稍后用于生成“会话密钥”
向客户端确认使用的加密方法;
发送服务器证书;
第三阶段:
客户端验正服务器证书,在确认无误后取出其公钥;(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)
客户端发送以下信息给服务器端:
一个随机数;(秘钥,用于服务器上的公钥加密)
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
客户端握手结束通知;
第四阶段:
收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有到的“会话密钥”;
向客户端发送如下信息:
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
服务端握手结束通知;
3、PKI:公钥基础设施(其功能主要是维护证书提供证书的,发放证书只是PKI中的一个功能)
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库
4、OpenSSL功能应用
(1)组件:
libcrypto, libssl主要由开发者使用;
openssl:多用途命令行工具;
(2)openssl子命令:(当输入一个错误命令时,会跳出一个子命令使用提示窗口eg:openssl ?)
许多子命令,分为三类:
标准命令:enc, ca, req, genrsa, ...
消息摘要命令(dgst子命令)
加密命令(enc子命令)
a、对称加密:
工具:openssl enc, gpg
支持的算法:3des, aes, blowfish, towfish
enc命令:(-e表示加密,-d表示解密)
加密:~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
解密:~]# openssl enc -d -des3 -a -salt -out fstab -in fstab.ciphertext
b、单向加密:(计算特征码)
工具:openssl dgst, md5sum, sha1sum, sha224sum, ...
dgst命令:
~]# openssl dgst -md5 /PATH/TO/SOMEFILE
c、生成用户密码:
工具:passwd, openssl passwd
openssl passwd -1 -salt SALT
d、生成随机数:
工具:openssl rand
~]# openssl rand -hex NUM
~]# openssl rand -base NUM
e、公钥加密:
加密解密:
算法:RSA,ELGamal
工具:openssl rsautl, gpg
数字签名:
算法:RSA, DSA, ELGamal
工具:
密钥交换:
算法:DH
生成密钥:
生成私钥: ~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
提出公钥: ~]# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
f、Linux系统上的随机数生成器:
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞;
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞;
伪随机数不安全;
熵池中随机数的来源:
硬盘IO中断时间间隔;
键盘IO中断时间间隔;
5、CA有两种: 公共信任的CA,私有CA;
(1)私有CA:在私有范围内建立通信时可以建立私有CA:
openssl(小范围内测试,直接使用此工具)
openssl命令:
配置文件:/etc/pki/tls/openssl.cnf
OpenCA(一个开源的CA工具,维护大量CA)
a、构建私有CA:(94分钟)
在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可;
步骤:
(1) 生成私钥;
~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
查看:~]# ls /etc/pki/CA/private
(2) 生成自签证书的命令;
~]# 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:证书的有效时长,单位是day;
需要完善的信息:
Country Name (2 letter code) [XX]:CN(所在国家)
State or Province Name (full name) []:Beijing(所在省市)
Locality Name (eg, city) [Default City]:beijing(所在城市)
Organization Name (eg, company) [Default Company Ltd]:magedu(组织机构、公司名称)
Organizational Unit Name (eg, section) []:ops(所属部门)
Common Name (eg, your name or your server‘s hostname) []:ca.magedu.com(服务器名称)
Email Address []:[email protected]
(3) 为CA提供所需的目录及文件;
~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
~]# touch /etc/pki/CA/{serial,index.txt}
~]# echo 01 > /etc/pki/CA/serial
b、CA创建完成,现在可以发证了,假如某服务器要用到证书进行安全通信,需要向CA请求签署证书:(105分钟)
步骤:(以httpd为例)
(1) 用到证书的主机生成私钥;
~]# mkdir /etc/httpd/ssl
~]# cd /etc/httpd/ssl
~]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048) 2048位的秘钥
(2) 生成证书签署请求
~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
(3) 将请求通过可靠方式发送给CA主机;
(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
c、吊销证书:
步骤:
(1) 客户端获取要吊销的证书的serial(在使用证书的主机执行):
~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
(2) CA主机吊销证书
先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;
吊销:
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
其中的SERIAL要换成证书真正的序列号;
(3) 生成吊销证书的吊销编号(第一次吊销证书时执行)
# echo 01 > /etc/pki/CA/crlnumber
(4) 更新证书吊销列表
# openssl ca -gencrl -out thisca.crl
查看crl文件:
# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text
以上是关于加密和解密技术基础与OpenSSL的主要内容,如果未能解决你的问题,请参考以下文章