1、加密与解密基础概念
SSL全称:Secure Sockets Layer,安全套接字层;
安全的目标:
1>保密性:confidentiality;
2>完整性:integrity;
3>可用性:availability;
攻击类型:
1>威胁保密性的攻击:窃听、通信量分析;
2>威胁完整性的攻击:更改、伪装、重放、否认;
3>威胁可用性的攻击:拒绝服务(DoS)
安全相关的加密和解密:
1>传统加密方法:替代加密、置换加密;
2>现代块加密方法:现代块加密机制;
安全相关的服务机制:
1>认证机制;
2>访问控制机制;
2、Linux系统上基于安全相关的协议或工具:OpenSSL(ssl协议)、GPG(gpg协议);
加密算法和协议:
1>对称加密:3DES,AES;
2>公钥加密:不常用,比对称加密要慢3个数量级,RSA,DSA;
3>单向加密:MD5,SHA1…;
4>密钥交换:RSA,DH(Deffie-Hellman),ECDH(椭圆曲线DH),ECDHE(临时椭圆曲线DH);
2.1 对称加密:
常用的对称加密算法:
DES: Data Encryption Standard,数据加密标准;以64bits(8Byte)为一块进行56bits的秘钥进行加密和解密;
3DES:Triple DES;
AES: Advanced Encryption Standard, 高级加密标准;有多种变长秘钥,128/192/256bits;
Blowfish;
Twofish;
RC6;
CAST5;
对称加密的特性:
1>加密和解密使用同一个秘钥;
2>将原始数据分隔成固定大小的块进行逐个进行加密;
对称加密的缺陷:
1>秘钥过多;
2>秘钥分发困难;
2.2 公钥加密:秘钥分为公钥与私钥;
公钥:pubkey,从私钥中提取产生,可以公开给所有人;
私钥:secret key,通过工具创建,使用者自己留存,必须保证其私密性;
公钥加密的特性:用公钥加密的数据,只能使用与之配对的私钥解密;反之亦然;
公钥加密的用途:
1>数字签名:主要在于让接收方确认发送方的身份;
2>秘钥交换:发送方用对方的公钥加密一个对称秘钥,并发送给对方;
3>数据加密解密;
公钥常用算法:RSA,DSA,ELGaml(商业加密算法);
RSA:数字签名+加密解密;
DSA:数字签名;Digital Signature Algorithm;
公钥加密的工作模式:
数据从用户Bob发送给Alice的数据加密过程:
1> Bob用单向加密算法对数据data计算并得出数据的特征码;
2> Bob用自己的私钥加密特征码,形成数字签名,并把数字签名信息附在data后面;
3> Bob用对称加密算法加密(一次性加密)上面内容(数据+数字签名);
4> Bob用Alice的公钥加密由对称加密得出的密钥,并将加密后的信息附在上面内容(加密后的数据+数字签名)后面;
Alice接收到加密数据后的解密过程:
1> Alice用自己的私钥解密(解密后得出:加密的数据+数字签名、由Bob生成的对称加密密钥);<保密性>
2> Alice用由Bob生成的对称加密密钥进行解密(解密后得出:数据+数字签名);<秘钥交换>
3> Alice用Bob公钥解密(解密后得出:数据、数据的特征码);<身份验证>
4> Alice用跟Bob相同的单向加密算法对数据进行加密,得出另一个特征码,用此特征码比对上面解密出来的特征码,如果相同,则表示数据的<完整性>;
2.3 单向加密:提取数据指纹(数据的特征码),只能加密,不能解密;
单向加密的特性:定长输出、有雪崩效应(初始数据的微小改变将导致加密结果的巨大变化);
单向加密的功能:完整性验证;
单向加密的算法:
md5: Message Digest 5,128bits定长输出;
sha1: Secure Hash Algorithm 1,160bits定长输出;
sha常用的定长输出: sha224,sha256,sha384,sha512等;
2.4 密钥交换:IKE(Internet Key Exchange,互联网秘钥交换);
密钥交换常用的实现方法:
RSA;
DH(Deffie-Hellman);
ECDH(椭圆曲线DH);
ECDHE(临时椭圆曲线DH);
上图说明:
1> Alice和Bob协商生成2个公共数据:大素数p,整数g,整数g是大素数p的本原根;
2> Alice选择一个密钥数字a,明文发送A给Bob,其中A=g^a%p;
3> Bob选择一个密钥数字b,明文发送B给Alice,其中B=g^b%p;
4> Alice计算密钥值s,s=(g^b%p)^a%p;
5> Bob计算密钥值s,s=(g^a%p)^b%p;
6> 至此,Alice和Bob拥有一个相同的秘钥s;
4、PKI:Public Key Infrastructrue,公钥基础设施;
PKI的组成部分:
1> 签证机构:CA;
2> 注册机构:RA;
3> 证书吊销列表:CRL;
4> 证书存取库:CB;
X.509:目前版本是v3;
被广泛使用的数字证书标准,是由国际电联电信委员会(ITU-T)为单点登录(SSO-Single Sign-on)
和授权管理基础设施(PMI-Privilege Management Infrastructure)制定的PKI标准;
X.509 v3证书数据结构:
Certificate:证书
Version :版本
Serial Number :序列号
Algorithm ID :算法标识
Issuer :颁发者,一般是CA机构
Validity :有效期
Not Before :有效起始日期
Not After :有效终止日期
Subject :使用者
Subject Public Key Info :使用者公钥信息
Public Key Algorithm :公钥算法
Subject Public Key :公钥
Issuer Unique Identifier (Optional) :颁发者唯一标识
Subject Unique Identifier (Optional) :使用者唯一标识
Extensions (Optional) :扩展
…
Certificate Signature Algorithm :证书签名算法
Certificate Signature :证书签名
检查证书的5个环节:
1>确认认可签发证书的CA机构;
2>证书内容没问题;
3>证书在有效期内;
4>证书上的名字与当前通信的主机名字一致;
5>证书没有被吊销;
5、SSL/TLS
SSL:Secure Sockets Layer,安全套接字层;<版本:ssl 1.0 , ssl 2.0 , ssl 3.0>
TLS:Transport Layer Security,传输层安全;<版本:tls 1.0 , tls 1.1 , tls 1.2 , tls 1.3>
SSL/TLS分层设计:
1> 最底层:基础算法原语的实现,比如定义aes,rsa,md5等的功能;
2> 向上一层:各种算法的实现;
3> 再向上一层:组合算法实现的半成品;
4> 最高层:用各种组件拼装而成的各种成品的密码学协议软件;
用于实现SSL/TLS功能的程序中,常用的是:OpenSSL;
OpenSSL的组成部分:
1> libcrypto:用于实现加密解密的库;
2> libssl: 用于实现SSL安全通信的库;
3> openssl: 命令行工具;
双向证书认证的SSL握手过程(SSL_handshake_with_two_way_authentication_with_certificates):
上图说明:
phase 1:
1> client:生成一个随机数,RNc;
2> client —> server:发送 Client Hello 消息,这个消息里包含了一个客户端生成的随机数 RNc、客户端支持的加密套件(Support Ciphers)和 SSL Version 等信息;
3> server:生成一个随机数,RNs;
4> server —> client:发送 Server Hello 消息,这个消息会从 Client Hello 传过来的 Support Ciphers 里确定一份加密套件,这个套件决定了后续加密和生成摘要时具体使用哪些算法,另外还会生成一份随机数 RNs;
phase 2:
1> server —> client:发送server端证书;
2> server —> client:要求客户端发送client证书;
3> client:验证服务端证书;验证通过后,提取出服务端的公钥;
phase 3:
1> client —> server:发送client证书;
2> server:验证客户端证书;验证通过后,提取出客户端的公钥;
3> client —> server:发送用客户端私钥加密的证书;
4> server:验证加密的客户端证书;用客户端公钥进行解密;
5> client:生成随机数,pre-master-secret;
6> client —> server:客户端用服务端的公钥加密随机数pre-master-secret,发送给服务端;
7> client,server:根据三个随机数(RNc,RNs,PMS)计算出对称加密秘钥MS;
phase 4:
1> client —> server:使用相同的对称加密密钥MS建立加密连接;
2> client —> server:结束SSL handshake;
3> server —> client:使用相同的对称加密密钥MS建立加密连接;
4> server —> client:结束SSL handshake;