为什么80%的码农都做不了架构师?>>>
1. 数据传输分类
在互联网上数据传输有两种:明文传输和加密传输。明文传输的协议有:ftp、http、smtp、telnet。但是为了数据的完整性和安全性,所以后来引用了加密等相关手段来保证数据的安全和完整性。
2. 案例引入
我在外地出差,因工作需要,公司主管要发给我一份重要资料给我,怎么才能让这个资料顺利的传到我的手上,而且我怀疑有人会窃取这个重要资料,若是被谁窃取到那公司损失就大了!
3. 安全的特点
我能确定这个资料来来自公司 --- 数据来源认证
我能确保在通过因特网传输时没有被修改过 --- 数据的完整性保护(传输的过程中是否被修改)
确宝没有别人能够看到这份资料 --- 数据私密性 (不能被别看到)
主管不能事后否认他曾经发送过那份资料本给我 ---(不可否认性)
4. 角色说明
互联网 黑客 数据 加密 数据
5. 算法
(1). 密码学算法主要分为两个大类,对称加密算法和非对称加密算法,对称加密算法技术已经存在了很长的时间。最早在埃及使用!
(2). 我们很快就能看到,对称加密算法和非对称加密算法各有所长和弱点,所以现代密码系统都在努力做到适当地使用这两类算法以利用它们的长处,同时又避开它们各自的缺点。
6. 对称加密算法的加密和解密原理
对称加密算法概念:
使用相同密钥与算法进行加解密运算的算法就叫做对称加密算法
具体加密过程如下图:
7. 对称加密算法的传输过程
似乎很完美,但是有个大的Bug?
(1). 主管怎么把他加密使用的密钥交给我呢?
(2). 难道你想说通过互联网发给我?
(3). 有办法了我坐飞机到上海来拿?
(4). 有脑子的人都知道这有个BUG?
下面我们得说一下密钥是如何交换的,
密钥交换(IKE)
密钥交换的算法(IKE)过程如下,
-
主管和我:p 大素数,g 生成数
-
主管:x 、我:y
-
主管:g^x%p --> 我
-
我:g^y%p -->主管
-
主管: (g^y%p)^x=g^yx%p
-
我: (g^x%p)^y=g^xy%p
这个结果就是密钥,在互联网中传输的只有四个数,p g x y,这样就能保证,密钥安全!
主流的对称加密算法有:
-
DES(56位)
-
3DES (168位)
-
AES (128位)
AES 192 AES 256 AES 512 -
Blowfish
下面我们总结一下对称加密的优缺点,
优点:
-
速度快
-
加密相对安全
-
加密紧凑(不会发生加密前与加密后文件大小相关太大)
-
缺点:
-
随着参与者数量的增加,密钥数量急剧膨胀((n×(n-1))/2)(还说我们的案例,主管传输数据不止发给我一人)
-
因为密钥数量过多,对密钥的管理和存储是一个很大的问题
-
不支持数字签名和不可否认性(不能认证数据是否完整,不支持身份认证)
由上面可以看出,对称加密能帮我们解决数据加密问题,但对称加密不能帮我解决以上所有问题,那我们便看看非对称加密能否帮我们解决问题?
8. 非对称加密算法原理
非对称加密算法的概念
非对称加密算法的主流协议为RSA,需要每一个参与者产生一对密钥。共享公钥到服务器,严格保障私钥的安全性。根据这种操作的特点,也被称作公共密钥算法。
密钥对:公钥publickey私钥scritekey,公钥是来自于私钥的。
具体过程如下,
加密原理图如下,
9. 非对称加密的传输过程
这样总能得到资料了吧,嘿嘿!看似上述的过程没有问题,可是现在的黑客十分“下流”,他可能会先截取主管发的资料(虽然他打不开),然后他会用一个其它文件用我们的公钥加密(因为公钥是公开的任何人都能拿到),来替换主管发的资料,并发给我!由此可看,我们还是没能拿到我们的资料,我们需要通过某种方式来认证资料确实是主管发的,而不是黑客发的!下面总结一下非对称加密的优缺点,
优点:
-
安全,因为不必发送密钥给接受者,所以非对称加密不必担心密钥被中途截获的问题
-
密钥数目和参与者数目相同,没有复杂的密钥分发问题
-
在交换公钥之前不需要预先建立某种信任关系
缺点:
-
加密速度很慢
-
密文会变长(案例:若1GB大小文件,加密后会变成1.5GB左右)
由上面的优缺点分析,我们发现非对称加密,又不适合加密,那有人会问了,那非对称加密不什么用都没有,我想说,不是的。在实际应用中非对称加密是这样应用的,还说我们上面说的那个案例,主管理现在要发一重要资料给我,主管先随机生成一公钥与私钥,主管先把公钥发给我,当然黑客可能也会拿到(毕竟是公开的嘛),然后用私钥加密数据发给我,我用主管理的公钥进行解密,若能看到数据那说明发送者是主管(其实就是进行身份认证)!
主流的非对称加密算法有:
-
RSA 加密和签名
-
DSA 签名
-
ElGamal
总结:
非对称加密算法作用,
发送方用自己的私钥加密数据,可以实现身份验证
发送方用对方的公钥加密数据,可以保证数据的机密性(但是加密速度慢,加密后密文会变长等缺点,我们一般不用它加密)
由上面的讲我们可以看到,对称加密和非对称加密各自都有优缺点,但又能分别解决相关问题(对称加密算法能实现数据加密,非对称加密算法能实现身份认证),有朋友会说了,能不能综合一下呢?还有个问题那就是数据完整性怎么保证呢?(请大家思考!)
10. 单向加密算法(散列函数)
概述:
散列函数也叫做HASH函数,主流的散列算法有MD5与SHA-1。散列函数的主要任务是验证数据的完整性。通过散列函数计算得到的结果叫做散列值,这个散列值也常常被称为数据的指纹(Fingerprint)也叫数字签名。
特点:
输入一样,输出必须相同
雪崩效应:输入的微小改变,将会引起结果的巨大改变
定长输出:无论原始数据是多大,结果大小都相同的
加密过程不可逆,无法根据特征码还原原来的数据
工作原理:
主流的单向加密算法:
Md4
Md5
SHA1
SHA192 SHA256 SHA384CRC-32
11. 理想方案
具过程如下,
(1). 主管的加密过程
主管用散列函数对将要发给我的重要资料进行一次特征码提取,得到时数字签名1 (数字签名也叫特征码,也叫摘要其实就是说法不一样,意思相同,大家理解就行)
主管再用自己的私钥加密数字签名1,此时会得到加密的数字签名1和重要资料
主管随机生成一个对称密钥加密我们的数字签名1和重要资料,但此时只有主管理能解密,所有我们还得在数字签名1和重要资料后面加上主管随机生成的密钥
主管将用我的公钥加密随机生成的对称密钥,会得到加密的随机对称密钥,那最终的数据会有这些,加密的随机密钥、加密的数字签名1和重要资料
(2). 我的解密过程
首先我用自己的私钥解密加密的随机对称密钥,得到随机的对称密钥
用得到的随机对称密钥解密加密的数据签名1和主要资料
用主管的公钥解密数字签名1
用散列函数对重要资料进行一次特征码提取,得到数字签名2
比较数字签名1和数字签名2是否一样
具体分析,经过上述的加密解密过程我们可以看出,数据的加密,身份认证,数据完整性验证,都得到了很好的体现,主管随机生成的对称密钥对数据进行加密,我用主管的公钥进行对主管的身份认证,通过数字签名对数据进行完整性验证,基本达到加密传输的要求,我们可以看到整个过程最核心的是依赖主管的公钥,若黑客替换了主管理的公钥怎么办?
12. PKI (Public Key Infrastructure 公共密钥基础设施)
PKI(Public Key Infrastructure ) 即"公钥基础设施",是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系,简单来说,PKI就是利用公钥理论和技术建立的提供安全服务的基础设施。完整的PKI系统必须具有权威认证机构(CA)、数字证书库、密钥备份及恢复系统、证书作废系统、应用接口(API)等基本构成部分,构建PKI也将围绕着这五大系统来着手构建,其中最重要的就是CA认证机构!
CA认证标准是X.509标准,CA具体内容包括,
公钥和证书的有效期
证书的合法拥有者
证书该如何使用
CA信息
CA签名的检验码
CRL 证书撤销列表
总结,CA证书最主要的功能就是认证我们要访问的服务器公钥有权威性 (在我们的案例中就是认证主管的公钥没有被黑客修改过,嘿嘿)
13. PKI的两种具休实现
(1). TSL/SSL 都符合 X.509标准
(2). OpenGPG
我们这里主要讲SSL(安全的套接字层 Secure Socket Layer)
14. SSL 详解
通过TCP/IP协议模型我们可以看出,SSL协议处于应用层与传输之间,下面我们主要说明https主要的实现过程,
具体说明:
Client 能互联网下载CA的公钥,用于验证Server身份
Server 通过加密算法生成一对密钥,将公钥发给CA认证机构,做数字证书
CA 通过自己的私钥加密 Server 公钥并加上自己的数字签名后,将生成的数字证书发给Server
Client 与 Server 通TCP的三次握手建立连接
Client 发出HTTP的报文请求,并和Server协商使用哪种算法加密
Server 响应报文并将公钥(CA证书)发送给客户端
Client 能通过CA的公钥解密CA证书,得到Server的公钥和数字签名,Client 通过散列函数算出Server公钥的数字签名与得到的数字签名对比,来验证Server身份,验证成功并发送数据请求
Server 处理请求,并根据Client请求的资源类型,来访问相关资源做出响应报文,并记录日志
Client 与 Server 通过TCP的四次挥手断开连接,通信完成
15. SSL 的工具实现 OpenSSL
(1). 安装OpenSSL (默认已安装)
12345 [root @localhost ~]# rpm -qa | grep opensslopenssl-0.9.8e-12.el5_4.6openssl-0.9.8e-12.el5_4.6openssl-devel-0.9.8e-12.el5_4.6openssl-devel-0.9.8e-12.el5_4.6(2). OpenSSL 软件组成
libcrpto:通用加密库
libssl:TLS/SSl的实现,基于会话的,实现了身份认证、、数据机密性和会话完整性的TLS/SSL库
openssl:多用途命令行工具,可以实现私有证书颁发机构
(3). 常用的OpenSSL的命令
子命令:
openssl
123 speed #:测试评估系统对加密算法的性能 (openssl speed des)enc:加密算法salt:加salt加密实例:
123456 openssl enc -des3 -salt -a -in inittab -out inittab.des3 :加密数据openssl enc -des3 -d -salt -a -in inittab.des3 -out inittab:解密数据openssl dgst -sha1 inittab:计算数据的特征码(摘要)openssl passwd –l 密码 :输入密码即可显示加密后的密码openssl passwd -1 -salt 数据:加密的时候指定saltopenssl rand -base64 100:生成随机数(4). OpenSSL openssl实现私有CA具体步骤
第一步,创建CA机构
修改配置文件
自己生成一对密钥 (私钥加密http公钥)
生成自签证书第二步,客户端
生成一对密钥
生成证书颁发请求---.csr
将请求发给CA第三步,CA机构
签署此证书
传送给客户端(5). CA配置文件:/etc/pki/tls/openssl.cnf (只讲解重要部分)
[ CA_default ]
dir = /etc/pki/CA #工作目录 ,此处需要指定,不然给客户到签证的时候必须在特定的目录下才能实现。
certs = $dir/certs #客户端证书目录
crl_dir = $dir/crl #证书吊销列表
database = $dir/index.txt #证书记录信息
new_certs_dir = $dir/newcerts #新生成证书的目录
certificate = $dir/cacert.pem #CA自己的证书位置
serial = $dir/serial #序列号
crlnumber = $dir/crlnumbe #证书吊销列表序列号
crl = $dir/crl.pem #证书吊销列表文件
private_key = $dir/private/cakey.pem #CA自己的私钥
RANDFILE = $dir/private/.rand #随机数文件
(6). CA机构 先生成一对密钥,然后生成自签证书
a. 生成密钥
命令格式:openssl genrsa -out /PATH/TO/KEYFILENAME NUMBITS #NUMBITS:密钥长度,默认是128位的
(umask 077;openssl genrsa -out server.key 1024) #生成后直接为700权限的key
命令格式:openssl rsa -in /PATH/TO/KEYFILENAME –pubout #读入密钥文件并输出公钥文件(提取公钥)
openssl rsa –in server.key –pubout
b. 生成证书
openssl req -new -x509 -key server.key -out server.crt -days 365 #(-days:证书的有效期限),然后输入相关的信息即可生成证书
注意:主机名称:至关重要,与主机名称保持一致,DNS主机名称,通信的唯一凭证
openssl x509 -text -in server.crt #查看新生成的CA证书
16. 建立私有CA 颁发机构
(1). 修改配置
vim /etc/pki/tls/openssl.cnf
[ CA_default ]
dir = /etc/pki/CA #工作目录 ,此处需要指定,不然给客户到签证的时候必须在特定的目录下才能实现。
certs = $dir/certs #客户端证书目录
crl_dir = $dir/crl #证书吊销列表
database = $dir/index.txt #证书记录信息
new_certs_dir = $dir/newcerts #新生成证书的目录
certificate = $dir/cacert.pem #CA自己的证书位置
serial = $dir/serial #序列号
crlnumber = $dir/crlnumbe #证书吊销列表序列号
crl = $dir/crl.pem #证书吊销列表文件
private_key = $dir/private/cakey.pem #CA自己的私钥
RANDFILE = $dir/private/.rand #随机数文件
x509_extensions = usr_cert
(2). 把自身服务器做成CA
cd /etc/pki/CA
(umask 077; openssl genrsa -out private/cakey.pem 2048) #生成证书
openssl req -new -x509 -key private/cakey.pem -out cacert.pem #生成自签证书
mkdir certs newcerts crl #建立相关的目录
touch index.txt
touch serial #建立序列号文件
echo 01 > serial #写入起始序列号
(3). 配置httpd使用证书
cd /etc/httpd #web服务器的配置目录
mkdir ssl
cd ssl #每一种服务要想使用证书,必须有私钥,每一种应用都需要自己的证书
(umask 077; openssl genrsa -out http.key 1024)#给自己生成密钥
openssl req -new -key httpd.key -out httpd.csr #证书签署请求文件,机构和其他名字必须和CA颁发机构上的一样
openssl ca -in httpd.csr -out httpd.crt -days 365 #CA签名,签名以后才可以使用
cat index.txt
cat serial