常用的加密算法和协议:

1、对称加密加密和解密使用同一个密钥;

    特性

     1、加密、解密使用同一个密钥;

     2、将原始数据分割成为固定大小的块,逐个进行加密;

    缺陷

          1、密钥过多;

          2、密钥分发困难;

    常见算法:DES、3DES、AES、Blowfish、Twofish、...

================================================================================

2、公钥加密也称为非对称加密,密钥分为公钥与私钥

        公钥(public key):从私钥中提取产生;可公开给所有人;

        私钥(secret key):通过工具创建,使用者自己留存,必须保证其私密性;;

    特点:用公钥加密的数据,只能使用与之配对儿的私钥解密;反之亦然;

    用途

        数字签名:主要在于让接收方确认发送方的身份;

        密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方;

       数据加密(不常用,比对称加密要慢3个数量级,即10的3次方倍)

    常见算法:RSA, DSA, ELGamal 

    (DSA仅能用于数字签名;RSA既能用于数字签名,也能实现数据的加密和解密)

================================================================================

3、单向加密即提出数据指纹(特征码);只能加密,不能解密;

    特性:定长输出(密钥长度固定);

             雪崩效应(初始数据的微小改变将导致加密结果的巨大变化);

    用途:完整性(用于实现数据的完整性验证);

    常见算法:md5(128bits)、sha1(160bits)、sha224, sha256, sha384, sha512

================================================================================

4、密钥交换 IKE(Internet Key Exchange)

IKE常见的实现方法:    

    公钥加密(完成密钥交换)

    DH算法(相比于公钥加密,DH更为常用;公钥加密时公钥是公开的,而DH算法不用将密钥公开即可完成密钥交换)

例如:A和B协商利用p和g加密,并有各自的私钥x,y

A:p, g

B:p, g

    A: x(仅A自己可见)--> p^x%g ==> B    

    A: (p^y%g)^x=p^yx%g

   

    B: y(仅B自己可见)--> p^y%g ==> A 

    B: (p^x%g)^y=p^xy%g

    密钥交换常用的算法:RSA,DH(迪菲-赫尔曼),ECDH(椭圆曲线DH),ECDHE(临时椭圆曲线DH)

================================================================================

例如:Alice向Bob发送数据的过程:

    1、Alice利用单向加密计算出数据的特征码,并用自己的私钥加密特征码附加在数据后,加密后的特征码即数字签名

    2、Alice利用对称加密,加密整段数据并生成密钥,且利用Bob的公钥将此密钥加密;

    3、Bob得到加密的数据后,利用自己的私钥解密,得出加密数据的密钥并将其解密,而后得到数据和加密的特征码:

        1) Bob利用Alice的公钥解密出数据的明文特征码(Alice的身份得到验证);

        2) Bob利用同样的单向加密算法计算出数据的特征码;

    4、Bob将两个特征码对比,如果一样,则确保了数据的完整性(未被更改过),且在这个过程中确保了数据的保密性并完成了密钥交换

================================================================================

证书管理机构—CA

CA:Certificate Authority,CA是通信双方都信任的实体,被称为可信第三方,CA通过证书证实他人的公钥信息,证书中绑定了公钥数据、和相应私钥拥有者的身份信息,并带有CA的数字签名。证书中也包含了CA的名称,以便于依赖方找到CA的公钥、验证证书上的数字签名。

公钥基础设施PKI

PKI:Public Key Infrastructure,PKI是以CA为核心提供公钥加密和数字签名服务的系统或平台,目的是为了管理密钥和证书。CA是证书的签发机构,是PKI的核心。

PKI的组成部分:

    签证机构:CA

    注册机构:RA

    证书吊销列表:CRL

    证书存取库:CB

X.509v3格式:定义了证书的结构以及认证协议标准

                版本号

                序列号

                签名算法ID

                发行者名称 

                有效期限

                主体名称

                主体公钥

                发行者的惟一标识

                主体的惟一标识

                扩展

                发行者的签名(CA自签名)

证书的验证

1、用CA的公钥解密CA的数字签名(验证证书来源可靠);

2、用和数字签名同样的加密算法去加密证书,取得特征码,与解密出的特征码对比是否相同(验证证书完整性可靠);

3、检查证书的有效期限,过期则不予认可;

4、验证主体名称(验证证书持有者的真实性),C/S架构中,主体名称即主机名称,客户端请求的服务器的主机名和服务器持有的证书中的主体名称必须一致;

5、检查证书是否处于吊销列表中

================================================================================

SSL及TLS

SSL(Secure Sockets Layer 安全套接层),及其继任者TLS(Transport Layer Security  传输层安全),是为网络通信提供安全及数据完整性的一种安全协议。

SSL:Secure sockets Layer(安全套接字层)

SSL协议位于与各种协议之间,为提供安全支持。

研发公司:Netscape: 1994

协议版本:V1.0, V2.0, V3.0

TLS: Transport Layer Security(传输层安全)

TLS是IETF(互联网工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。

研发组织:IETF: 1999           

协议版本:V1.0, V1.1, V1.2, V1.3

TLS的分层设计:

    1、最底层:基础算法原语的实现,aes, rsa, md5

    2、向上一层:各种算法的实现;

    3、再向上一层:组合算法实现的半成品;

    4、用各种组件拼装而成的各种成品密码学协议软件;

SSL会话主要三步:

1、客户端向服务器端索要并验正证书;

2、双方协商生成“会话密钥”;

    (前两步通常被称为ssl会话的握手阶段[ssl handshake])

3、双方采用“会话密钥”进行加密通信;

SSL Handshake Protocol:

第一阶段:ClientHello:

支持的协议版本,比如tls 1.2;

客户端生成一个随机数,稍后用于生成“会话密钥”

支持的加密算法,比如AES、3DES、RSA;

支持的压缩算法;

第二阶段:ServerHello

确认使用的加密通信协议版本,比如tls 1.2;

服务器端生成一个随机数,稍后用于生成“会话密钥”

确认使用的加密算法;

发送服务器证书;(如果服务器端需要验证客户端证书,还要向客户端发起请求)

第三阶段:

客户端验正服务器证书(发证机构、证书完整性、证书持有者、证书有效期、吊销列表),在确认无误后取出其公钥;

发送以下信息给服务器端:

    1)一个随机数(用于服务器进行公钥加密);

    2)编码变更通知,表示随后的信息都将用双方商定的加密算法和密钥发送;

    3)客户端握手结束通知;

第四阶段:

服务器端收到客户端发来的总过程的第三个随机数pre-master-key后,计算生成本次会话所用到的“会话密钥”;

向客户端发送如下信息:

    1)编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;

    2)服务端握手结束通知;

================================================================================

安全协议的开源实现:OpenSSL

OpenSSL由三部分组成:

    libencrypto库 (加密解密库,用于实现加密解密)

    libssl库 (用于实现ssl安全通信机制的库)

    openssl(多用途命令行工具 )

             libcrypto和libssl主要由开发者使用

openssl支持众多子命令,主要分为三类:

    1)标准命令

    2)消息摘要命令(dgst子命令相关)

    3)加密命令(enc子命令相关)

查看openssl版本号以及获取openssl相关命令提示(openssl错误就会提示):

标准命令: enc, ca, req, genrsa, ...

对称加密:

工具:openssl  enc,  gpg

支持的算法:3des, aes, blowfish, towfish

enc命令

[-e 加密算法] [-d 解密算法] [-a表示使用base64位文本编码格式] 

[-salt表示加入杂质] [-in 加密前文件] [-out 指明加密后的文件]

加密:~]# openssl  enc  -e  -des3  -a  -salt  -in fstab   -out fstab.ciphertext

解密:~]# openssl  enc  -d  -des3  -a  -salt  -in fstab.ciphertext -out fstab   

---

单向加密:

    工具:openssl dgst, md5sum, sha1sum, sha224sum, ...

    dgst命令:~]# openssl  dgst  -md5  /PATH/TO/SOMEFILE  [-md5表示使用md5算法]

例如使用同种单向加密算法计算出的文件的特征码是相同的

生成用户密码:

    工具:passwd, openssl  passwd

    openssl passwd -1 -salt SALT [-1表示使用md5加密算法] [-salt 杂质应该用随机数]

单向加密的雪崩效应:

生成随机数:

    工具:openssl  rand   [NUM 指定随机数的个数]

    ~]# openssl  rand  -hex  NUM    [-hex表示使用16进制数字编码]

    ~]# openssl  rand  -base  NUM   [-base表示使用base64位文本格式编码]

---

使用相同的杂质计算同样的密码得到的结果是相同的:

公钥加密:

    加密解密

        算法:RSA,ELGamal

        工具:openssl rsautl, gpg

    数字签名

        算法:RSA, DSA, ELGamal

        工具:openssl rsautl, gpg

    密钥交换

        算法:DH

生成公钥加密的密钥对

    生成私钥:(umask 077)表示在子shell中运行命令,即临时生成的私钥的文件权限为600 

        ~]# (umask 077;  openssl  genrsa  -out  /PATH/TO/PRIVATE_KEY_FILE  NUM_BITS)

    从私钥中提取公钥: [NUM_BITS表示指定的密钥长度,必须是2的n次方倍]

        ~]#  openssl  rsa  -in  /PATH/FROM/PRIVATE_KEY_FILE  -pubout

从私钥中提取公钥:

================================================================================

Linux系统上的随机数生成器:

/dev/random:仅从熵池返回随机数;随机数用尽则阻塞进程获取随机数,等待随机数产生;

/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞;伪随机数不安全;

熵池:运行中的内核在内存中维护的一段有大量随机数的空间;

熵池中随机数的来源:

    硬盘IO中断时间间隔;

    键盘IO中断时间间隔;

熵池中的随机数耗尽时可通过复制大文件(硬盘IO)产生大量随机数

CA:

    1)公共信任的CA;

    2)私有CA(仅用于有限范围内通信);

建立私有CA的工具:

    1)openssl命令

    2)OpenCA(功能更加强大、健全的CA工具)

openssl命令:

    配置文件:/etc/pki/tls/openssl.cnf

构建私有CA:

在确定要配置为CA的服务器上生成一个自签证书,并为CA提供所需要的目录及文件即可;

步骤:

(1) 生成私钥; 

~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)

私钥默认要求放在/etc/pki/CA/private目录下,且配置文件中默认定义了私钥的文件名为cakey.pem

(2) 生成自签证书;

~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655

req:证书请求生成的工具

-new:生成新证书签署请求;

-x509:生成自签格式证书,专用于创建私有CA时;

-key:生成请求证书时用到的私有文件路径;

-out:生成的请求文件路径;如果是自签操作将直接生成签署过的证书;

-days:证书的有效时长,单位是day;

自签证书在配置文件中默认定义了路径为/etc/pki/CA/private/cacert.pem

申请证书需填写的信息:

国家代码名称

所在州或省

城市名称

公司或组织名称

部门名称

个人名称或主机名称

管理员邮箱地址(可以为空)

(3) 为CA提供所需的目录及文件;

~]# mkdir  -pv  /etc/pki/CA/{certs,crl,newcerts}  [如果存在则不用创建]

~]# touch  /etc/pki/CA/{serial,index.txt}    [serial序列号;index.txt数据库文件]

~]# echo  01 > /etc/pki/CA/serial          [serial文件中需指定第一个证书的序列号]

================================================================================

要用到证书进行安全通信的服务器,需要向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

注意:如果是web服务器,证书申请时填写的名字必须与服务器的主机名一致!

(3) 将请求通过可靠方式发送给CA主机;

例如这里是测试,通过scp命令将证书签署请求复制到CA主机上

(4) 在CA主机上签署证书;

~]# openssl ca  -in  /tmp/httpd.csr  -out  /etc/pki/CA/certs/httpd.crt  -days  365

CA签署证书后即可在index.txt中看到证书的序列号等信息,V表示证书已签

CA签署证书后就可以将证书发送给请求的主机,得到证书的主机得到crt文件后就可以使用CA签名后的证书了,csr文件即可删除之以防信息泄露

查看证书中的信息:(拥有证书的CA主机和客户端主机都可以查看证书信息)

~]# openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject

[-in 证书文件] [-noout -serial -subject表示只看序列号和证书持有者主题信息]

================================================================================

吊销证书:(当客户端的密钥丢失时,CA需要将客户端的证书吊销)

步骤:

(1) 客户端获取要吊销的证书的serial(在使用证书的客户端主机执行):

~]# openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject

(2) CA主机吊销证书

先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;

吊销:其中的SERIAL要换成证书真正的序列号;

# openssl  ca  -revoke  /etc/pki/CA/newcerts/SERIAL.pem

(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