本章主要描述加密算法的由来,特点以及在实践中的应用。
一、背景
TCP/IP协议诞生之初是为局域网服务的,安全方面的考虑不是重点,所以很多的协议如ftp,http,smtp,telnet都是明文的协议,通过抓包分析软件很容易得到用户的密码口令。
二、加密
一般来说,从三个方面来考虑数据的安全传输:机密性,完整性以及身份验证。
1.机密性
从发送方言就是将明文数据根据某种转换规则转换为密文,接收方再根据这种转换规则把密文转换为明文,这种转换规则就是加密算法,在算法中,密钥是关键,因为一种通用的加密算法更换难度是非常大的,而更换密钥就相对容易。
从保护数据机密性的角度来说,有对称加密算法和非对称加密算法两种。
1.1 对称加密算法特点
- 加密和解密使用同一个密钥,效率高
- 将原始数据分割成固定大小的块,逐个进行加密
- 常见的有DES,3DES,AES等
- 缺点是密钥过多,数据来源无法确认
1.2 非对称加密算法特点
- 密钥是成对出现的,公钥:公开给所有的人;私钥:自已留存,必须保证其秘密性
- 用公钥加密的数据只能使用与之配对的私钥解密;反之亦然
- 缺点:密钥长,加密解密效率低下
- 功能:数字签名:主要在于让接收方确认发送方身份;对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方
- 常见的有RSA,DSA等
2. 完整性
通过单向散列算法(又称hash算法)将任意数据缩小成固定大小的指纹
- 任意长度输入
- 固定长度输出
- 若修改数据,指纹也会改变
- 无法从指纹中重新生成数据
- 常见算式:md5,sha1,sha224, sha256,sha384,sha512
3. 身份验证
- 通过单向散列算法提取128bit的数字摘要(指纹)
- 用自已的私钥对数字摘要加密(数字签名)
- 用接收都B的公钥对数字摘要和原文加密(通常对对称的加密算法,因为加密和解密的效率高)
- 发送给B
接收者B:
- B用自己的私钥对密文解密
- 用A的公钥把数字签名解密(如果用A的公钥无法解密数字签名,则说明数字签名已经经过第三方的篡改,B会丢弃所收到的数据)
- 同时B用单向散列算法对原文进行128bit的数字摘要提取
- 并且和用A的公钥解密后的数字签名作比对,如果一致,则证明数据的完整性,如果不一致,则说明数据有人篡改
但是A和B如何能安全的收到对方的公钥,必须借助于第三方的工具如证书来解决。
三、CA和证书
1. 简介
证书的本质上利用第三方的可信任机构颁发的证书来传输公钥。
如图所示,A和B分别获取对方公钥的流程:
- A向上级CA颁发机构申请证书,CA颁发机构分成各种不同的层级,无论如何,最后总是会追溯到根证书的颁发机构ROOTCA
- A在申请证书的过程中,需要提供自已的公钥
- 各级CA颁发机构分别用自己的私钥对A的公钥进行签名
- A得到的证书文件包含各CA颁发机构的公钥
- B重复同样的流程
- A、B在应用程序通信之前,已经内置了包含了各CA颁发机构公钥的证书
- 最终A、B通过这个证书链得到对方的公钥
CA和证书生成、管理、颁发、使用,存储,吊销是有PKI(PKI Key Infrsatrcture)来定义这一体系中的各种角色,策略,流程等,同时,证书遵循x.509协议标准,定义了定义了证书的结构以及认证协议标准,主要包括的内容有:
- 版本号
- 序列号
- 签名算法
- 颁发者
- 有效期限
- 主体名称
证书的类型有:
- 证书授权机构的证书
- 服务器证书
- 用户证书
获取证书的两种方法
- 使用证书授权机构(是一种商业行为,根据证书的不同等级费用不一),主要步骤有:生成签名请求(csr);将csr发送给CA;从CA处接收签名
- 自签名证书:顾名思义用自己的私钥签发自已的公钥,是免费的,可以用在公司内部一些安全级别要求较高的应用服务上
2. 用openssl来生成自签名证书的步骤
向CA申请证书书:
1. 建立Root CA
1)生成私钥
cd /etc/pki/CA/
(umask 077;openssl genrsa -out private/cakey.pem 4096)
2) 自签名证书
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650(参数-x509表示自签名,不带此参数代表申请证书)
openssl x509 -in cacert.pem -noout -text(以text方式查看证书)
2. 用户或服务器
1) 生成私钥
(umask 077;openssl genrsa -out app.key 1024)
2) 生成证书申请文件
openssl req -new -key app.key -out app.csr
3) 将申请文件发给CA
scp app.csr [email protected]:/etc/pki/CA
3. CA颁发证书
touch index.txt
echo 0F > serial
ca -in app.csr -out certs/app.crt -days 100
/etc/pki/tls/openssl.cnf(可以修改此文件中的policy)
4. 证书发送给客户端
把生成的证书发给客户端app.crt
3. openssl用法:
openssl paswd -1(生成以md5加密的密码)
openssl rand -hex 3(3代表字符,一个字符占8位,每一位16进制占4bit,所以输出是6个16进制的字符)
openssl rand -base64 3(3代表字符,一个字符占8位,base64每一个字符占6bit,所以输出为4个base64编码的字符,如果无法整除,如4个字符,则用=补齐)
(umask 066;openssl genrsa -out private.key -des 1024) 生成带口令的私钥
openssl rsa -in private.key -out private.key2(输出一个不带口令的私钥)
openssl rsa -in private.key -pubout -out public.key(从私钥中生成公钥)
四、SSL/TLS安全协议
如上图所示SSL/TSL工作于传输层之上,主要功能实现数据传输的机密性,认证,完整性,重放保护等。
此协议分为握手阶段和应用阶段:
- 握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过MasterSecret生成
- 应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信
结全TCP/IP的三次握手过程,在完成三次握手之后,还需要根据上述流程完成SSL协议的通信。基中:
- Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换
- ChangeCipherSpec 协议:一条消息表明握手协议已经完成
- Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告
- Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
其中,常用的HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二进制形式传输
总之,在加密与安全方面,用户私钥的管理是至关重要的,通常我们用加密码的方式对私钥进行加密,这样,即使用第三非法提到私钥,也会为因为没有密码导致没法获取私钥的明文,大大增加了系统的安全性。