一、加密协议和算法

    1.对称加密算法:加密和解密使用同一秘钥

        主流私钥加密算法:            

            DES:数据加密标准

    64bit块,加密密钥的长度56bit

    NSA

    3DES,三次DES加密

    AES:高级加密标准

加密密钥的长度更长:128bit,192bit,256bit

    Blowfish

    Twofish

            IDEA

    RC4,RC6

    CASTS


        特性:

            1.每对通信主机都需要保有一个唯一的通信密钥,用于加密和解密数据

    2.将原始的数据分割成固定大小的块逐个加密

    3.加密和解密的速度非常快

        缺陷:在一台主机上需要保有的密钥数量比较多;密钥的分发非常困难


    2.公钥加密算法:

        由私钥和与私钥数学相关的公钥构成,其中公开的密钥为公钥,不公开的密钥为私钥


        使用公钥加密的数据只有用与之对应的私钥才能解密,使用私钥加密的数据只有用与之对应的公钥才能解密

            使用公钥加密:用于其他用户向该用户传递加密信息,只有该用户的私钥才能进行解密

            使用私钥加密:其他用户使用公钥进行解密,用于确定用户身份,这种方法叫做数字签名


        公钥加密算法的私钥长度均较长:512bit,1024bit,2048bit,4096bit,8192bit,16384bit


        主流公钥加密算法:

            RSA:加密,数字签名

            DSA:只能做数字签名,也被称为DSS

            Elgamal


        缺陷:加密数据的时候,消耗的资源和时间都较多,速度很慢,因此,极少用来加密大量数据,所以进行数据加密的时候仍使用对称加密算法,但在传输过程中,将对称加密算法的密钥通过公钥加密算法进行加密。

     


    3.单向加密算法:

        只能加密不能解密,又称为"数据指纹提取",其输出结果为定长的特征码,即"数据指纹"

        

        主流的单向加密算法:

    md5:128bits定长输出

    sha系列:安全的哈希算法

sha-1,sha224,sha384,sha512


二、CA和PKI

    PKI是一种遵循标准的利用公钥加密技术为电子商务的开展提供的一套安全基础平台的技术和规范,其提供安全服务利用公钥技术和证书,包含以下内容:    

        1.签证机构:CA

        2.注册机构:RA

        3.证书吊销列表:CRL

        4.证书存储库:CR


    国际标准化组织(ISO)定义了证书的结构和认证标准,:x.509协议标准

证书的组成包括:

    证书的版本号

    证书的序列号

    有效期限

    签发算法的ID

    证书主体的名称

    证书主体的公钥

    证书主体唯一标识符

    发证者的唯一标识符

    发证者的数字签名

    扩展信息


    通信双方进行身份认证的步骤:        

        1.通信双方互相交换证书

2.双方验证证书的真伪

3.双方协商加密算法

4.用CA办法的公钥解密证书中的CA的签名,能解密说明证书来源可靠

5.用协商出来的加密算法加密证书,并取得特征值,与解密出来的特征值进行比较,如果相同,说明证书完整性有保证

6.检查证书的有效期是否合法,如果在有效期内,则证书可用

7.检查证书的主体名和此次通信的目标是否能够对应;

8.检查证书是否被吊销


三、实现安全加密功能:

    1.进行安全加密传输数据的一般步骤:

        1)通信双方互相交换证书,并到信任的CA进行证书有效性认证

        2)发送方:

            ① 使用协商好的对称加密算法进行数据加密

            ② 使用单向加密算法对加密后的密文抽取特征值,并使用自己的私钥将特征值加密

            ③ 利用接收方的公钥对对称加密算法的私钥进行加密

        3)接收方:

            ① 使用自己的私钥解密对称加密算法的私钥

            ② 使用发送方的公钥解密被加密的特征值,证明数据来源可靠

            ③ 利用相同的单向加密算法对密文进行抽取特征值,若与发送方的特征值相同,则证明数据完整未损坏

            ④ 利用对称加密算法对密文进行解密

    

    2.实现上述安全加密功能的协议

        1)SSL:Security Socket Layer,安全套接字层

            位于传输层和应用层之间。


        2)TLS:Transport Layer Security,传输层安全协议

            分层设计方案:

最底层:规定了基础算法的原语的实现;包括:AES, md5, sha,...

向上一层:各种算法的基本实现;

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

最高层:用各种组件拼装而成的各种成品密码学协议软件;


            由于较低层位于某个传输协议上面,与上面具体的应用无关,故一般把TLS归于传输层安全协议


    3.SSL/TLS的handshake的四个阶段:

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

    发送Client Hello的消息,此消息主要内容:

支持的协议的版本,如:SSL v3.0或TLS v1.2;

客户端生成一个随机数,稍后用于生成回话密钥;

支持的加密算法,如:DES,3DES,AES,RSA,....

支持的压缩算法,如:gzip,bzip2,deflate,...


2)双方协商生成会话密钥:

    发送Server Hello消息,此消息主要内容:

确认使用的协议的版本,如:TLS v1.2

服务器也生成一个随机数,稍后用于生成会话密钥;

确认加密算法和压缩算法;

服务器的证书;


3)双方采用以及生成的会话密钥进行安全加密的数据通信:

    ① 客户端验证服务器证书,在确认无误后,取出其中的服务器公钥;

验证服务器证书的步骤:

    验证发证机构(CA);

    验证证书的完整性;

    验证证书的持有者信息;

    验证证书的有效期;

    验证CA的吊销列表中是否有此证书;


    ② 客户端发送信息给服务器端;

    ③ 客户端再次生成一个随机数,用于公钥加密;

    ④ 编码格式的变更通知,表示以后的信息都将采用双方已经协商好的加密算法和压缩算法;

此时客户端握手结束;


            ⑤服务器收到客户端发送来的第三个随机数(Pre_Master_key),计算生成此次会话用到的会话密钥,向客户端发送相关信息;

            ⑥编码格式的变更通知,表示以后的信息都将采用双方已经协商好的加密算法和压缩算法;

                此时服务器端握手结束;


4)双方互相结束通信:

        

四、openssl命令行工具:  

    众多的子命令实现各种安全加密功能

    标准命令:

enc,dgst,ca,req,genrsa,rand,rsa,x509,passwd,...


    对称加密命令enc:

提供对称加密算法,以进行数据或文件的手动加密

    openssl enc -ciphername [-in filename] [-out filename] [-e] [-d] [-a/base64] [-salt]

-ciphername:加密算法的名称

-in filename:openssl要读取的文件路径

-out filename:加密或解密操作后用于保存结果的文件路径

-e:加密操作

-d:解密操作

-a/-base:用纯文本格式进行密文编码

-salt:随机加盐


    示例:

加密文件:

    openssl enc -e -des3 -in anaconda-ks.cfg -a -out anaconda-ks.cfg.encryptfile


解密文件

    openssl enc -d -des3 -out anaconda-ks.cfg -a -in anaconda-ks.cfg.encryptfile


单向解密命令dgst

    示例:

openssl dgst -sha1 fstab


生成随机数命令rand:

    openssl rand [-out file] [-rand file(s)] [-base] [-hex] num


    示例:

openssl rand -base64 8


生成带盐的密码passwd

    openssl passwd -1 -salt SALT_STRING


    示例:

openssl passwd -1 -salt 01234567


公钥加密算法genrsa

    生成rsa加密算法的私钥

openssl genrsa [-out filename] [-des] [-des3] [-idea] [-f4] [-3] [numbit]


    出于安全考虑,需要给创建的私钥富裕只有拥有者才能读写其他人都不能读写的权限,建议使用下列方法生成私钥

]#(umask 077 ; open ssl genrsa -out /tmp/my.key 4096)

]#(umask 077 ; open ssl genrsa > /tmp/my.key 4096)


                umask:设置之后创建文件的权限掩码,即对umask命令后面的权限码进行取反即为创建文件的权限码。                


从已经生成的私钥文件中抽取公钥rsa

    openssl rsa  [-in filename] [-out filename] [-pubout]

-pubout:抽取公钥

-in filename:私钥文件的路径

-out filename:公钥文件的路径


    示例:

openssl rsa -in key.my -out mykey.pub -pubout



五、利用openssl建立私有CA

    1.首先创建CA所在主机的私钥文件

    2.生成自签证书

    3.必须为CA提供必要的目录协议文件以及文本级文件

目录级文件:

    /etc/pki/CA/certs

    /etc/pki/CA/crl

    /etc/pki/CA/newcerts

文本级文件:

    /etc/pki/CA/serial保存证书序列号编号,一般初始序列号为01

    /etc/pki/CA/index.txt:证书索引

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


    示例:

创建CA的密钥文件

    ]#umask 077  

            ]#openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048


生成自签证书

    使用openssl req命令

openssl req [-out filename] [-new] [-key filename] [-x509] [-days n]


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


            之后需要在交互界面填写相应信息,国家、地区、城市、单位等,生成的证书为加密后数据


            使用x509命令查看证书内容

            ]#openssl x509 -serial -noout -in /etc/pki/CA/cacert.pem

            ]#openssl x509 -subject -noout -in /etc/pki/CA/cacert.pem


完善目录及文本文件结构

    ]#touch /etc/pki/CA/index.txt

    ]#echo 01 > /etc/pki/CA/serial


六、吊销证书:必须在CA上执行:

    1.获取客户端证书对应的序列号

openssl x509 -in /etc/pki/CA/certificate -noout -serial


    2.吊销证书

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


注意,上述命令中的"SERIAL"要换成准备吊销证书的序列号


    3.生成吊销证书的吊销索引文件;仅需要第一次吊销证书时执行此操作:

echo "SERIAL" > /etc/pki/CA/crl/crlnumber


    4.更新证书吊销列表

openssl ca -genctl -out /etc/pki/CA/crl/ca.crl 


    5.查看CRL

openssl crl -in /etc/pki/CA/crl/ca.crl -noout -text


七、实现加密/解密的应用程序:gpg,可以使用gpg实现对称加密

    gpg2 [--homedir dir] [--options file] [options] command [args]

常用选项

    -c:实施对称加密

    -o file , --output file:将解密结果保存于指定文件中

    --gen-key:生成密钥对,即公钥+私钥

    --list-keys:查看公钥

    --export:导出钥匙环上所有的公钥,也可以导出指定名称的公钥:默认直接将公钥输出到标准输出;需要配合使用-o或--output选项,才能将其保存到文件中

    --import:导入指定的公钥到钥匙环

    -r: 复制加密文件

    -e 加密数据

    --delete-key name

    --delete-secret-key name

    --delete-secret-and-public-key name

删除公钥和/或私钥


    gpg应用示例:

        加密文件:

    ]# gpg -c fstab


        解密文件:

    ]# gpg -o fatab.out fstab.gpg

    注意参数和参数的顺序


生成密钥对:

    ]# gpg --gen-key


查看公钥:

    ]#gpg --list-key


        导出公钥:

    ]#gpg -a --export -o /tmp/qhdlink.pub


在其他主机导入公钥,以进行公钥加密:

    ]# gpg --import /PATH/TO/qhdlink.phb


在其他主机上使用的公钥加密文件:

    ]# gpg -e -r qhdlink.pub /PATH/TO/SOME_FILE