简介

目前数据的加密方式有3种:单向加密,对称加密,公钥加密(非对称加密),我们常见的加密算法有DES,MD5,SHA1...SHA512,RSA,都有各自不同的用处。简单介绍下这3中加密方式。


单向加密

通过某种Hash 函数对原始数据进行提取,提取得到一端固定长度的密文(不管文件有多大,密文长度不变),这段数据也常被称为数据指纹或特征码。

        特点:1)单向加密,只能由原始数据得到特征码,而不能由特征码逆向推出原始数据。

                  2)雪崩效应,原始数据微小的改变会导致特征码巨大的变化

        应用:常被应用于数字签名,验证数据的完整性,而没有被他人篡改过;

        常见的算法:MD5、SHA1、SHA256、SHA384、SHA512(特征码长度为512)


对称加密

加密和解密使用的是同一个秘钥

        特点:加密解密速度快(相对于非对称加密)

        应用:适合大数据的加密,一般服务器和客户端的回话都是采用这种加密方式的

        常见的算法:DES、3DES、AES、Blowfish(商业的).......

在通信过程中,由于双方采用的是同一个秘钥,这个秘钥在网络上的安全传输显得非常关键,若这个秘钥被他人破解,则接下来传输的数据也会被他人截获。常见的秘钥传输有两者方式:1)利用DH算法(Diffie-Hellman)实现秘钥交换,2)通过对方的公钥对秘钥进行加密(只有对方的私钥才能解密)。


这里简单介绍一下DH算法,算法通过公共信道交换一个信息,然后建立一个可以用于在公共信道上安全通信的共享秘密(shared secret)。下面是关于这个算法最简单、最早突出的协议:使用一个素数p的整数模n乘法群以及其原根g。下面展示这个算法,绿色表示非秘密信息, 红色粗体表示秘密信息:

wKioL1WD9fniYzmPAACxLhR16ao494.jpg

1、爱丽丝与鲍伯协定使用 p=23以及base g=5.

2、爱丽丝选择一个秘密整数a=6, 计算A = ga mod p并发送给鲍伯

  • A = 56 mod 23 = 8.

3、鲍伯选择一个秘密整数b=15, 计算B = gb mod p并发送给爱丽丝

  • B = 515 mod 23 = 19.

4、爱丽丝计算s = B a mod p

  • 196 mod 23 = 2.

5、鲍伯计算s = A b mod p

  • 815 mod 23 = 2

爱丽丝和鲍伯最终都得到了同样的值,因为在模p下gabgba 相等。 注意a, b 和 gab = gba mod p 是秘密的。 其他所有的值 – p, g, ga mod p, 以及 gb mod p – 都可以在公共信道上传递。 一旦爱丽丝和鲍伯得出了公共秘密,他们就可以把它用作对称密钥,以进行双方的加密通讯,因为这个密钥只有他们才能得到。 当然,为了使这个例子变得安全,必须使用非常大的a, b 以及 p, 否则可以实验所有gabmod23的可能取值(总共有最多22个这样的值, 就算a和b很大也无济于事)。 如果 p 是一个至少 300 位的质数,并且a和b至少有100位长, 那么即使使用全人类所有的计算资源和当今最好的算法也不可能从g, p和ga mod p 中计算出 a。这个问题就是著名的离散对数问题。注意g则不需要很大, 并且在一般的实践中通常是2或者5。双方的计算结果相同,之后就用这个结果作为双方通信的对称加密秘钥

(注:以上关于DH算法的信息来自基维百科)


公钥加密(非对称加密)

非对称加密需要有两个密码:公钥和私钥,用私钥加密,只能由公钥解密,反之,用公钥加密,只能用私钥解密。私钥只有拥有者持有,公钥是公开的。先生成私钥,再从公钥中提取出私钥。

        特点:由于算法比较复杂,加密解密速度慢(非常慢),优点是通讯双方不需要事先进行秘钥交换,且秘钥方便管理

        应用:用于数字签名和秘要交换

        常见的算法:RSA(又可以做加密解密,也可以做身份认证), DSA(只做身份认证), EIGamal(商业的)


加密解密过程
1)wKioL1WEA7fSy1mgAABz2OX541U568.jpg

将原始数据和加密后的特征码一并发给对方,对方接收到数据后,先用发送方的公钥解密特征码(能解密,既保证了数据的来源可靠性),再用相同的单向加密算法计算出特征码与解密得到的特征报进行比对(相同则保证了数据的完整性)。以上方式保证了数据的来源和完整性但是数据是明文传输的。这个往往用于软件包的发布。

2)wKioL1WEBWqgsS9xAACt954IM2w517.jpg

对方接收到数据以后先用自己的私钥对加密的对称秘钥进行解密,再用得到的对称密钥对秘文进行解密,剩下的和第一种情况一致,这样就保证了数据在传输过程中的保密性。这里涉及到了全部的3种加密解密方式,但是有个问题,如何将自己的公钥安全地送到对方的手中。这个就需要CA来完成。


 CA(Certificate Authority

CA即为证书授权中心,被称为可信第三方(Trusted Third Party,简称TTP)。CA通过证书证实他人的公钥信息,证书上有CA的签名。


1)证书

证书内容包括证书持有者的主体名称,公钥,有效期,CA的签名.........,其中最重要的是主题名称和公钥,通讯时,通讯双方先通过CA的公钥去解密对方证书中的CA签名(可信度较高的CA的证书会被直接集成在操作系统当中),验证完证书之后(包括来源可靠性、完整性验证),提取出证书中的公钥和对方进行通信。下面就是X.509标准规定的证书格式,CA在签署证书时通过Hash算法对证书申请者提交的信息进行单向加密,得到特征码,再用自己的私钥对特征码进行加密,将加密得到的签名附在信息后面,这个整体即为证书:

wKiom1WECVahefHJAADQ9Gg9c9M889.jpg

主体名称:拥有者的名称信息,用于主机的证书时,主体名称为主机名,用于个人时,是个人名称(这个很关键)

主体公钥:拥有者的公钥(由证书拥有者提供)


2)PKI(公钥基础设施)

PKI(Public Key Infrastructure),X.509标准将PKI定义为支持公开密钥管理并能支持认证、加密、完整性和可追究性服务的基础设施,PKI由下面几部分组成:

  1、签证机构(CA)

   2、注册机构(RA)

   3、证书吊销列表(CRL)

   4、证书存取库(用户过来检查证书吊销列表中的证书是否存在时的一种接口)

证书吊销列表保存了在有效期内但不再使用的证书,如某个证书持有者把私钥泄露了或某些原因不再使用证书,即可向CA提交申请,吊销该证书。


3)证书的验证

在双方通讯之前会先去验证证书:

    1、用CA的私钥验证通过证书的签名验证证书的有效性和来源可靠性(参考上面)

    2、通过主体名称验证验证证书持有者的真实性(若客户端与服务器,这个主体名称为主机名称,客户端请求的主机名和服务器持有的证书中的主体名称必须一致)

    3、查看证书是否在吊销列表上


openssl

在说openssl之前先介绍两个协议SSL协议和TLS协议

SSL(Secure Sockets Layer安全套接层),是为网络通信提供安全及数据完整性的一种安全协议。Secure Socket Layer,为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。TLS(Transport Layer Security,安全传输层协议)是SSL的继任者,两者的实现机制基本相似。(注以上信息来自百度百科)


SSL在转中的位置:

wKiom1WEF1PBdTEaAACe4TI9Y1g083.jpg


关于ssl会话的建立请参阅http://ljbaby.blog.51cto.com/10002758/1663738。


再来说openssl,openssl是一套密码学工具箱,实现了SSLv2/v3,TLSv1以及与SSL/TLS相关的密码标准。openssl囊括的内容如下:密码算法库,Hash算法库,数字签名算法库,X.509证书处理库,CA工具库,SSL处理库,EVP算法封装库,BIO抽象I/O封装库,openssl工具包。

openssl的组成可归结为下面3部分:

openssl: 多用途命令行工具,各功能分别使用子命令实现

libcrypto: 公共加密库(里面实现了很多种加密算法,实现加密解密功能的)

libssl: ssl协议的实现

openssl的命令分为下面几大类:

         standard command:标准命令

         message digest command:信息摘要命令(单向加密) [通过dgst选定某个算法]

         cipher command:加密命令 [通过enc指定某个算法]

下面简单看一下openssl命令的简单应用:


单向加密:

格式:openssl dgst [-md5|-sha1...|sha512] [-out /path/to/filename] filename

-out   #将密码输出至文件

filename   #需要计算特征码的文件

[[email protected] ~]# openssl dgst -sha512 /etc/passwd
SHA512(/etc/passwd)= 1a6f7c05773750920f29c9360e04603f195047a93d65c2a66da042d89c14e99f6235ef0ce6afeed4cd3e083ad2a18bfc0fac769d5b6242df617f9eef9d8736e3


用户密码的生成(3种加密方式,单向加密):

   openssl passwd -crypt -salt xx password

   openssl passwd -1 -salt xxxxxxxx password

   openssl passwd -apr1 -salt xxxxxxxx password

        

生成随机数:

    openssl rand -base64|-hex  num

        -base64|-hex   #为编码格式

        num                #随机数长度


对称加密:

格式:openssl enc -ciphername [-in filename] [-out filename] [-a/-base64] [-k password] [-S salt] [-salt] [-d]...

-d                           #解密

-ciphername         #指定加密方式

-in filename          #需要加密的文件

-out filename        #加密后文件


加密:

[[email protected] ~]# openssl enc -aes256 -a -salt -in /etc/passwd -out /tmp/aespasswd
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:

解密:

[[email protected] tmp]# openssl enc -d -aes256 -a -salt -in /tmp/aespasswd -out /tmp/passwd
enter aes-256-cbc decryption password:

支持的加密算法可查看man enc中的SUPPORTED CIPHERS,常见的有DES, AES, RC5, idea, CAST。


公钥加密:

    生成私钥:openssl genrsa  -out /path/to/keyfile NUMBER

        /path/to/keyfile    #私钥保存至文件

        NUMBER     #私钥长度

    提取公钥:openssl rsa -in /path/from/private_key_file -pubout

        -in          #指定读取私钥的文件

        -pubout     #输出公钥

         -text      #显示为纯文本格式(使用的话,会输出额外的文本编码信息)

类似的命令还有gendsa,dsa,enpkey,pkey。


生成私钥:

[[email protected] tmp]# openssl genrsa -out rsapasswd 2048
Generating RSA private key, 2048 bit long modulus
.............+++
.....................................................................................+++
e is 65537 (0x10001)

生成公钥:

[[email protected] tmp]# openssl rsa -in rsapasswd -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlv1nHNI5WAlKc/UdVy6Q
gXsxj1F0i7a9yjadP9QW4ks8K8oJDHQ0BQNOpNR6XHPe2XCY1pS/gjvlgLZkTUR9
jwAhiYBI9dwc/8N3CUzyhAJ8GmPKKBR2grVqrvrKI33EFNKckpqLG0CA0cYFq6lW
pkkmIwLoCxnSvUVIYhcMScm/6BITNKB7E8MXR9NWm9S4kQsVBa5Bd3rPAAH3vFDF
GrdpzVpkZ2Hk8+GYxaXAafJHnNE7iPx+nzxhn1/sEwW6/2zAubypqW483mrV+Zyl
rVFLCxjN1KxnvBrCHl4Ctvo/gFHBKJu+IasOTYhXRZTvO6w8pny5F9vyx0wX9zBO
XQIDAQAB
-----END PUBLIC KEY-----


openssl实现私有CA

1)建立CA服务器(下面的实验在两台电脑上进行CentOS,CentOS6

CA的工作目录:/etc/pki/CA,openssl的配置文件为/etc/pki/tls/openssl.cnf

[[email protected] CA]# ls
certs  crl  newcerts  private

cert                        # Where the issued certs are kept,存放已颁发的证书

crl                          # Where the issued crl are kept,证书吊销列表

newcerts               # default place for new certs,新证书的存放位置

private                  # 私钥存放处,且私钥必须命名为cakey.pem(根据配置文件中的设置)

需要手动创建的文件:

serial                     # The current serial number,序列号

index.txt               # database index file.数据库文件

crlnumber            # the current crl number


step1:生成私钥

[[email protected] CA]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
..............................................................+++
.................+++
e is 65537 (0x10001)

括号的作用是让里面的命令在子进程中进行,使得umask只在子进程中有效

umask 077                                    #设置私钥权限,保证安全

/etc/pki/CA/private/cakey.pem   #为配置文件中指定放置私钥的地方


step2:自签证书

[[email protected] CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:ZJ
Locality Name (eg, city) [Default City]:NB
Organization Name (eg, company) [Default Company Ltd]:XIAOXIAO
Organizational Unit Name (eg, section) []:ops
Common Name (eg, your name or your server's hostname) []:baby

req                                    #用来生成证书签署请求

-new                                 #生成新的认证请求

-key /path/to/keyfile        #指定私钥文件

-out /path/to/somefile     #公钥保存位置,按配置文件中的指定来存放(/etc/pki/CA/cacert.pem

-x509                                #生成自签署证书(只有自签署时使用)

-days n                             #有效天数(与-x509一起使用,一般由签署方决定用多长时间)

上面有关证书的信息可以在配置文件中设置默认值。


step3:初始化工作环境

touch /etc/pki/CA/{index.txt,serial,crlnumber}

   #每个文件的作用上面已经阐述

echo 01 > /etc/pki/CA/serial(序列号从01开始,需要明确说明,刚建立ca是才需要这么做)


2)节点申请证书

step1:节点生成请求

1、生成私钥

[[email protected] httpd]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
............................+++
............+++
e is 65537 (0x10001)


2、生成证书签署请求

[[email protected] httpd]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.

私有ca的话,证书上的信息应该是一样的,如果不一样,验证就不会通过。这些信息的默认值都在配置文件中/etc/pki/tls/openssl.cnf中,可以对其进行修改

3、把签署请求文件发送给CA服务

[[email protected] ssl]# scp httpd.csr [email protected]:/root/csr/
[email protected]'s password: 
httpd.csr                                                                                           100%    0     0.0KB/s   00:00


step2: CA签署证书

1、验正证书中的信息;

2、签署证书

[[email protected] CA]# openssl ca -in /root/csr/httpd.csr -out /root/crt/httpd.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)                                           #序列号
        Validity                                                                   #有效期
            Not Before: Jun 20 02:40:34 2015 GMT
            Not After : Jun 19 02:40:34 2016 GMT
        Subject:                                                                  #主体信息
            countryName               = CN
            stateOrProvinceName       = ZJ
            organizationName          = XIAOXIAO
            organizationalUnitName    = ops
            commonName                = www.xiaoxiao.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                B3:8E:5D:F3:72:3B:C2:CD:02:D8:E3:10:B5:EE:67:D6:0F:65:4D:75
            X509v3 Authority Key Identifier: 
                keyid:72:09:A9:51:48:74:A3:F1:3B:C9:DD:4D:4D:32:39:54:0A:AA:1C:DB

Certificate is to be certified until Jun 19 02:40:34 2016 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

ca                                   #签署证书的命令,也可以用来吊销证书

/path/to/somefile.csr    #证书请求文件

/path/to/somefile.crt    #证书存放位置(.crt后缀)

-days                              #指定有效时长

查看index.txt中的证书信息

[[email protected] CA]# cat index.txt
V	160619024034Z		01	unknown	/C=CN/ST=ZJ/O=XIAOXIAO/OU=ops/CN=www.xiaoxiao.com


3、发送给请求者(scp);

[[email protected] crt]# scp httpd.crt [email protected]:/root/ssl/
[email protected]'s password: 
httpd.crt                                                                                          100%    0     0.0KB/s   00:00


3)吊销证书

step1:节点请求吊销证书

1、获取证书serial(节点端)

[[email protected] httpd]# openssl x509 -in /etc/httpd/httpd.crt -noout -serial -subject
serial=01
subject= /C=CN/ST=ZJ/O=XIAOXIAO/OU=ops/CN=www.xiaoxiao.com

x509子命令表示读取x509格式的证书

-in /etc/httpd/httpd.crt    #指定证书文件

-noout                         #表示不输出任何额外的信息

-serial                          #输出序列号

-subject                      #输出证书内容


step2: CA验证信息,吊销证书

1、根据节点提交的serial和subject信息来验正与index.txt文件中的信息是否一致;

2、吊销证书

[[email protected] CA]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem 
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 01.
Data Base Updated

-revoke    #吊销证书

#证书吊销之后index.txt中的相关记录会发生改变

[[email protected] CA]# cat index.txt
R	160619024034Z	150620030145Z	01	unknown	/C=CN/ST=ZJ/O=XIAOXIAO/OU=ops/CN=www.xiaoxiao.com


3、生成吊销证书的编号(如果是第一次吊销)

[[email protected] CA]# echo 00 > crlnumber
[[email protected] CA]# cat crlnumber 
00


4、更新证书吊销列表

[[email protected] crl]# cd /etc/pki/CA/crl
[[email protected] crl]# openssl ca -gencrl -out xiaoxiaoCa.crl
Using configuration from /etc/pki/tls/openssl.cnf
[[email protected] crl]# ls
xiaoxiaoCa.crl

-gencrl              #生成证书吊销列表

xiaoxiaoCa.crl   #证书吊销列表


关于查看crl文件的内容:

[[email protected] crl]# openssl crl -in xiaoxiaoCa.crl -noout -text
Certificate Revocation List (CRL):
        Version 2 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: /C=CN/ST=ZJ/L=NB/O=XIAOXIAO/OU=ops/CN=baby
        Last Update: Jun 20 03:23:18 2015 GMT
        Next Update: Jul 20 03:23:18 2015 GMT
        CRL extensions:
            X509v3 CRL Number: 
                0
Revoked Certificates:
    Serial Number: 01
        Revocation Date: Jun 20 03:01:45 2015 GMT
    Signature Algorithm: sha1WithRSAEncryption
         28:48:5d:e7:19:56:13:71:0f:db:29:2c:24:1a:0e:ef:97:fb:
         e8:08:05:9b:ed:af:ab:3d:17:91:45:88:31:a5:17:8f:7e:18:
         3e:59:1f:e6:08:70:ba:ca:fc:3b:27:e4:19:34:68:e1:81:11:
         5f:1e:36:cc:ef:41:9b:0f:a9:79:47:72:63:f2:fe:01:01:ce:
         b5:80:b1:d0:3d:28:d7:a7:ea:99:4d:c8:ff:d7:0c:58:91:f0:
         3c:46:e5:c8:92:70:04:6d:81:08:18:f1:f7:37:ea:12:a5:67:
         95:17:f3:63:27:f5:ed:39:74:ac:20:19:f9:aa:0c:d9:4d:ed:
         58:30:62:a9:27:e2:ce:fa:c0:96:3c:68:d3:8b:89:dc:9c:92:
         58:55:46:7f:26:76:87:f2:5b:1d:ee:76:70:20:5b:46:7e:53:
         12:b8:57:1c:c6:53:ff:b3:49:b2:83:88:cf:4a:e8:5a:e8:d6:
         37:7b:70:4d:9e:20:e7:80:27:6b:bc:33:c6:50:c4:f9:92:58:
         26:38:e7:98:0f:60:81:6f:9d:f3:99:6d:51:30:ef:33:b9:98:
         ea:78:d1:0e:34:eb:0a:9c:04:ad:27:ef:ca:16:cd:e6:08:fd:
         1d:2c:64:e6:b0:f3:18:8f:6d:89:fa:98:d0:29:f9:de:fa:f6:
         74:46:2e:f4

-text        #输出为文本信息

-noout    #不输出任何额外的信息

.................^_^