数据安全服务的几个方面:

    1、认证  
          访问控制 阻止对资源的未授权访问
    2、数据保密性 
    3、数据完整性
         要保证发送方所发送的数据没有被修改。。。
    4、不可否认性

一、怎么验证数据的完整性。也就怎么知道数据在传输的过程中没有被修改过。这就要使用到单向加密算法,提取数据的指纹(特征码)。

数据的传输双方为:甲、乙

甲:在数据传输之前,提取该数据的“指纹”然后,把数据指纹附加在数据中一起发送给乙。

乙:接收到该数据以后,再提取数据的“指纹”。与附加在数据中的数据指纹作比较,如果一样,

    就证明,该数据在是完整的,在传输的过程中没有被修改过。

例:

1、使用【md5sum】单向加密算法提取文件secure的数据指纹

[root@server test]# md5sum secure
1f66b7c25cd47ba8dbe78ee4c28dfd36  secure

2、在secure文件中新增空白行

增加前

[root@server test]# tail -2 secure
Aug  2 09:48:27 stu13 sshd[2231]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Aug  2 09:48:33 stu13 su: pam_unix(su-l:session): session opened for user root by admin(uid=

使用重定向增加空白行

[root@server test]# echo "" >> secure
[root@server test]# tail -2 secure
Aug  2 09:48:33 stu13 su: pam_unix(su-l:session): session opened for user root by admin(uid=502)

3、再提取文件secure的指纹

[root@server test]# md5sum secure
ffc2cd02fa9e936c29302c802131e629  secure

说明:

    从上面的事例可以看出,文件secure新增空白行之后,该文件的数据指纹已经发生了翻天腹地的改变了。类似于“蝴蝶效应”,在单向加密算法中被称为:”雪崩效应“。这也正是通过数据指纹可以检验数据的完整性的原因。


如果,在甲与乙的数据传输链路中,丙截获了数据包。上面的方法也不能确保数据在传输的过程没有被篡改过的。

通讯双方:甲、乙

***: 丙

:在发送数据包给乙之前,先提取数据指纹并把它附加在数据中一起发送给乙

:在数据包的传输链路中,使用某工具截获了甲发送给乙的数据包。修改数据内容,并重新生成数据

     指纹,再发送给乙

:接收到数据包以后,提取数据指纹。做数据指纹比较,是相同的。乙就认为该数据在传输的过程中

    没有被篡改过。事实上,数据已经被篡改过。

    原因:接收数据方乙,无从考证附加在数据包中的数据指纹是否是甲提取的。那么,乙怎么样才可以验证该数据指纹一定是甲提取的呢,还有数据指纹在传输的过程中没有被修改过。这就使用到非对称加密的功能了。


非对称加密的密钥是成对出现的,分为:公钥(public key)和私钥(secret key)。

这种加密方式有个特点:

                   公钥是公开的,私钥是自己保留的。
		   公钥是从私钥中提取而来的。
		   公钥加密的数据,使用私钥才能解密。
		   私钥加密的数据,使用公钥才能解密。

前提:

通讯双方为:甲、乙

在数据交互之前,通讯双方都各自生成密钥对,都把公钥给对方,私钥自己保留。

数据传输:

:提取数据的指纹,并使用接收者乙的公称加密数据指纹,然后再与数据一起发送给乙。

:在接收到数据之后,使用自己的私钥对数据指纹进行解密,如果能够解密成功,

    证明提取数据指纹的一定是甲。再提取数据的指纹。做数据指纹比较,如果它们一样的话。

    就说明,该数据在传输的过程中没有被篡改过。

如果,在数据的传输链路上截获了数据,篡改了数据,重新提取数据的指纹。但是没有数据发送者的私钥,接收者乙使用甲的公钥做数据指纹的制作者身份核实的时候就会发现数据指纹已经被修改了。这样就能检测数据在传输的过程中是否被修改过。即使某人截获了数据,接收者也能正确无误的判断数据在传输的过程中是否被人篡改过。也就是数据的完整性。

   但是,甲发送给乙的数据是明文传输的,只保证了数据的完整性,没有满足数据的保密性的要求。如果它们传送的数据是机密性的内容,在数据链路上的窃听者就会截获到数据就可以看到数据包中的绝密内容。所以,我们的数据要加密之后,再传送的。


二、数据的保密性是如何实现的呢?    

数据的加密方式有两种:

1、对称加密    
2、非对称加密

     非对称加密的密钥非常长,对数据加密的速度比对称加密的速度慢得多。速度最少相差上百倍。如果web服务器传输的数据使用非对称加密的话,会影响用户的体验效果的。所以对称加密一般是用作数据加密的。

     但是,使用单向加密数据,通讯双方密钥交换也是个问题,怎么办呢?

非对称加密能够实现密钥的交换,对称加密加密数据的速度又很快,那么它们联合起来就可以解决:数据的加密和密钥的交换了。


:使用对称加密方法,一起加密数据和数据指纹。再使用乙的公钥加密对称加密的密钥。

     把它们一起发送给乙。

:接收到数据包以后:

     使用自己的私钥解密对称加密的密钥(甲使用乙的公钥加密了密钥) -----> 获取到了明文的对称加

                                                                       密的密钥

     使用密钥解密,数据与数据指纹。 --------------->    分别获取到使用乙公钥加密的数据指纹

                                                         和明文的数据

    使用自己的私钥解密数据指纹 ------------------->      获取到明文的数据指纹

    提取数据的数据指纹        ------------------->       做数据指纹的比较。

前面的甲乙双方数据通讯中:
         数据的保密性,使用对称加密。              密钥交换是依靠非对称加密完成的。
         数据的完整性,使用单向加密。              加密数据指纹、验证数据指纹的制作者的身
                                                    份都是非对称加密完成的。

    都涉及到了数据通讯双方的公钥。假如通讯双方在公钥交换的过程中,丙在数据的链路中,截取到了乙发给甲的公钥,丙自己生成密钥对把自己的公钥发给了甲。这样丙就冒充乙与甲进行通讯。也就是所谓”中间人***“。那么甲怎么确保与自己通讯的一定是乙呢?或者说自己获取到的公钥一定是乙的呢?这就要使用到数据证书了。

三、如何辨别公钥的真伪?

    这就需要一个第三方机构,认证中心CA。做个证明,这个证明就是所谓的数据证书。这个数据证书包含了用户的部分信息(如:主机名称、邮件地址)和公钥信息。通过查这个数据证书,就知道这个公钥一定是的。这样就可以放心地和进行数据交换了。

    但是,怎么知道这个这个数据证书一定是合法的公证的CA机构颁发的呢?

这就需要身份验证了,像公安局对***盖章一样,CA利用自己的私钥在乙的数字证书加上数据签名。甲利用CA的公钥就可以辨别数据证书的真伪了。


Linux 中是使用:Openssl 能够实现单向加密、对称加密、非对称加密、证书的发放制作以及简单构建一个PKI(公钥基础设施),是一种开源的实现。

openssl它由三个主件:

1、libcrypto
    这是一个加密库,专门为其它软件调用的加密功能的加密库。
2、libssl
    用于实现ssl协议的一个库。很多网络应用都可以使用ssl进行加密数据。如:web 服务器 Apache
3、命令行工具:openssl
    可以实现数据的完整性校验、加密、解密、证书的生成,还包括生成证书请求、颁发证书等等。

查看openssl工具的使用

[root@server ~]# openssl -h
openssl:Error: '-h' is an invalid command.

##openssl  命令的子命令。
## dgst    表示提取数据的特征码(数据指纹)。
## enc     表示使用对称加密算法加密数据
## getrsa  生成私钥
## req     从私钥中提取公钥,要求输入公司的名称、主机、邮箱、公司地址等。生成证书签署请求
## ca      CA机构审核证书签署请求后,使用该子命令发证
## passwd   加密明文的密码
Standard commands
asn1parse         ca                ciphers           cms
crl               crl2pkcs7         dgst              dh
dhparam           dsa               dsaparam          enc
engine            errstr            gendh             gendsa
genpkey           genrsa            nseq              ocsp
passwd            pkcs12            pkcs7             pkcs8
pkey              pkeyparam         pkeyutl           prime
rand              req               rsa               rsautl
s_client          s_server          s_time            sess_id
smime             speed             spkac             ts
verify            version           x509

##所支持的提取数据指纹的算法
Message Digest commands (see the `dgst' command for more details)
md2               md4               md5               rmd160
sha               sha1

##所支持的对称加密的算法
Cipher commands (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb
aes-256-cbc       aes-256-ecb       base64            bf
bf-cbc            bf-cfb            bf-ecb            bf-ofb
camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  camellia-192-ecb
camellia-256-cbc  camellia-256-ecb  cast              cast-cbc
cast5-cbc         cast5-cfb         cast5-ecb         cast5-ofb
des               des-cbc           des-cfb           des-ecb
des-ede           des-ede-cbc       des-ede-cfb       des-ede-ofb
des-ede3          des-ede3-cbc      des-ede3-cfb      des-ede3-ofb
des-ofb           des3              desx              rc2
rc2-40-cbc        rc2-64-cbc        rc2-cbc           rc2-cfb
rc2-ecb           rc2-ofb           rc4               rc4-40
seed              seed-cbc          seed-cfb          seed-ecb
seed-ofb          zlib

如果使用openssl进行对称加密的:

[root@server ~]# openssl enc -des3 -salt -a -in fstab -out fstab.des3
enter des-ede3-cbc encryption password:     -----> 输入密码 
Verifying - enter des-ede3-cbc encryption password:

查看加密后的文件类型

[root@server ~]# file fstab.des3 ----> 文件类型跟加密前一样的。但是打开是乱码。
fstab.des3: ASCII text

解密fatab.des3

[root@server ~]# openssl enc -d -des3 -salt -a -in fstab.des3 -out fstab
enter des-ede3-cbc decryption password:  --------> 输入密码

单向加密 使用命令dgst

[root@server ~]# openssl dgst -md5 fstab
MD5(fstab)= 53b4962a89e6eb77a83cb7592ee7f783

加密明文密码

[root@server ~]# openssl passwd -1  
Password:    ---> 输入明文的密码
Verifying - Password:
$1$CgFeVKbO$8.KGlawM.3vHADcOS1VZT.