#2.10.1  网络安全通信基础

         在这个危机四伏的互联网中,如何确保数据能安全可靠的发生给对方呢?我们收到的数据如何判断是否完整?是否被窃听?是否真正来自对方呢?我们需要一种这样安全服务来为提供保障。

 

安全机制:

         数据保密,使用秘钥通过加密算法将数据加密且只能通过秘钥解密

         秘钥交换,使用加密需要考虑如何将秘钥安全传给对方,通过交换机制可实现

 数据完整性,通过单项加密算法提取数据的特征码/指纹,判断数据是否完整

 身份认证,数据交换前需要认证双方的身份,通常使用证书认证

         访问控制,可通过配置使数据分流,私密数据走特定的通道

         流量填充,有意投放些垃圾流量,加大被破解的难度

l  数据加密

 加密类型通常有两类,对称加密和非对称加密。

 对称加密,双方使用相同的秘钥进行加解密。

 非对称加密,使用公钥加密,只能使用与其配对的私钥解密。

对称加密算法:

  对称加密算法的工作过程:首先需要将数据分成同等大小的组,组大小由算法定义,然后使用加密算法+秘钥加密所有组,常见的加密算法有3DES,AES,RC4

 

  对称加密的优点在于算法公开,计算量小,效率高。

  对称加密的缺点在于秘钥过多,每个回话都需要一个秘钥,不易管理;无法安全传输密码

 

                   

OpenSSL <网络通信安全基础>_第1张图片

 

         DES,组长度为64Bit,其中8位作为校验码,其中56位参与DES运算

               3DES,组长度为112Bit

               AES,组长度为128,192,256,384,512

        

         非对称加密算法:

    在非对称加密中,秘钥是成对的(公钥和私钥),公钥是完全公开的,私钥需要保密存放,使用公钥加密只能通过与其配对的私钥解密;并且公钥与私钥之间无法相互推导。

    常见非对称加密算法: RSA,DSA,

    优点:可实现身份认证,秘钥交换,数据加密功能。

    缺点:计算量大,效率低,适合加密较小的数据,通常用于加密对称加密算法的秘钥。

 

 

l  数据完整性

    数据完整性通过单向加密算法提取数据指纹实现.

    单向加密算法的特点:    a) 雪崩效应,数据微小的改变,结果巨大变化

                                                 b) 定长输出,无论数据多大,输出结果都一样长度

    常见的算法有:

            md5(128 bit) ,sha1(160 bit) ,sha256(256 bit) ,sha384(384 bit) ,sha512(512 bit)

 

l  身份认证

 身份认证是指数据的发送方/接收方需要进行认证对方的身份,通常使用非对称加密算法的特性制作数字签名完成此机制。

         数字签名:发送方产生一段数据(通常是数据的指纹)使用自己的私钥加密并附在数据的尾部发送给对方。私钥只有自己有,公钥是公开的,所以如果接收方接用公钥解密这段数据就能证明发送方的身份。

         另外,如果数据中途被篡改了,也能通过数据指纹发现。

 

        数据签名更详细的介绍地址:

        http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

 

 

 

l  秘钥交换

    非对称加密算法虽然不需要交换秘钥,但是其加密效率太低,通常不使用其加密较大的数据。

    对称加密安全高效,但是缺点在于秘钥交换和管理。

    秘钥交换可通过非对称加密算法和DH算法协商实现

 

    非对称加密算法实现:使用接收方的公钥加密对称加密算法的秘钥,发送至对方。这种实现秘钥依旧在互联网上传输,终不安全,所以推荐使用DH算法。

 

 

 

l  PKI(Public Key Infrastrancture)公共基础设施

    PKI是一套支持公开密钥管理并能支持认证、加密、完整性和可追究性服务的一套技术和规范。

    PKI组件:

         证书颁发机构,CA

         证书注册机构,RA

         证书吊销列表,CRL

         证书存取库

n  证书

    上述的公钥加密、秘钥交换机制都存在一个问题,加密的双发都依赖于对方的公钥,公钥的获取、传输时很有可能被掉包,这将导致整个加密过程都变得不安全。使用证书可解决此问题,证书由CA机构颁发,用于证明证书拥有者的身份和与之对应的公钥。所以在通信时双方交换证书即可。

 

CA颁发证书的过程:

            OpenSSL <网络通信安全基础>_第2张图片

使用证书验证对方公钥是否可靠的原理:

            OpenSSL <网络通信安全基础>_第3张图片

a)         通信双发首先交换发送自己的证书

b)         接收方使用CA的公钥解密该证书的数字签名,获取证书的用户信息与单向加密使用算法。

c)         通过单向加密算法提取数据指纹,对比数字签名中的指纹信息,看是否一致

 

注:通常操作系统内置受信任CA的证书(内含公钥),如果没有CA的公钥说明此CA不被操作系统信任。

 

目前常用的证书为X.509数字证书标准,其内容如下:

    OpenSSL <网络通信安全基础>_第4张图片

  • 2.10.2  OpenSSL

在Linux中使用OpenSSL即可实现上述功能,OpenSSL是一个安全套接字层密码库,包含主流的密码算法并且具有CA管理功能、SSL协议支持。

Openssl的组成部分:openssl libcrypto libssl

       openssl                     #接口命令行,通过此接口可使用其内部封装好的加、解密等功能

       libcrypto             #提供加、解密所需要的库文件

       libssl                   #提供SSL功能

加密/解密:

       Openssl  enc  -e   –des3|aes256|aes512  -a       -salt  -in  in_file    -out  out_file

       Openssl  enc  -d   –des3|aes256|aes512  -a       -salt  -in  in_file    -out  out_file

              -e    encryption  ,加密

  -d    decryption  ,解密

  -des3|aes256|aes512       ,表示使用的算法,使用man查看更多

  -a    使用base64编码

  -salt       自动加salt(杂质)值

  -in         输入文件路径

  -out       输出文件路径

    

使用AES加密/etc/fstab文件

[root@el7   ~]# openssl enc  -e  -aes256 -a -salt -in /etc/fstab -out   fstab.aes

enter   aes-256-cbc encryption password:

Verifying   - enter aes-256-cbc encryption password:

 

[root@el7   ~]# cat fstab.aes

U2FsdGVkX18QDV7bLjKYeNDkfbfN39YL2MXDbKhuy9fMFKWw5/Br7g5hyXXKWfq4

SBW9z1SiLBa/mdlGAniGGg==

 

解密:

[root@el7   ~]# openssl enc -d -aes256 -a -salt -in    fstab.aes -out fstab

enter   aes-256-cbc decryption password:

 

[root@el7   ~]# cat fstab

#

/dev/mapper/centos-swap   swap                    swap    defaults        0 0

 

单向加密:

       Openssl  dgst   -md5|sha1|sha224|sha512  -out  file     file

提取/etc/fstab文件的特征码

[root@el7   ~]# openssl dgst -md5  /etc/fstab 

MD5(/etc/fstab)=   032c6daf116ada90dbd3f8a76e143330

 

生成/etc/shadow中的密码,类似passwd命令:

       Openssl  passwd  -1   -salt string  

[root@el7   ~]# openssl passwd -1  -salt 123456

Password:  

$1$123456$wWKtx7yY/RnLiPN.KaX.z.

注意:   $1$             表示使用的是md5

              $2a$      表示使用的是Blowfish

              $5$        表示使用的是SHA-256算法

              $6$        表示使用的是SHA-512算法

在RHEL6/7中用户密码都使用的SHA512加密

[root@localhost ~]# cat   /etc/shadow | grep root

root:$6$FjZV6IAU$mo3qz…….AH/:17642:0:99999:7:::

$6$                            表示使用SHA512加密

FjZV6IAU                   为salt值

mo3qz…….AH           为加密后的值,…为省略的部分

[root@localhost ~]# cat   /etc/login.defs  | grep SHA

# Use SHA512 to encrypt   password.

ENCRYPT_METHOD   SHA512

 

 

生成随机数:

Openssl rand   -base64 | -hex   NUM                 

       -base64        表示使用base64编码

       -hex              表示使用16进制编码

 NUM            表示字节长度

生成100字节的随机数,并用base64编码

[root@localhost   ~]# openssl  rand  -base64    100

4v529JK2zLPzQM7Qv3CF/e2FItUttcj9oK0NVT3AULsWAv5sKV59+y4e/FGX1nb6

MC/k0fSgpxbbiMogNLig1NQ+w2tLxc5/aMxVItpfcZYlV1phhXAW/v+QIeXjfJdE

zAZ5Ew==

 

生成私钥

       Openssl  genrsa      [-des3]  -out file  NumBit

       -des3            表示使用des3将输出结果加密

       -out  file    表示将私钥输出到指定文件位置

       NumBit        表示输出的长度,必须要是512的倍数

生成私钥并修改权限为,只有自己能读取、修改

[root@localhost   ~]# (umask 077; openssl  genrsa    -out ~/myPrivateKey 2048)

Generating   RSA private key, 2048 bit long modulus

......................+++

...........................................+++

e   is 65537 (0x10001)

 

[root@localhost   ~]# ll myPrivateKey

-rw-------. 1 root root 1675 May  6 00:24 myPrivateKey

 

提取公钥

       Openssl rsa  -pubout   -in   PrivateKey.file    -out  PubKey.file

根据私钥文件myPrivatekey文件,提取公钥并写入至myPubKey文件

[root@localhost   ~]# openssl rsa -in  myPrivateKey   -pubout -out myPubKey

writing   RSA key

 

[root@localhost   ~]# cat myPubKey

-----BEGIN   PUBLIC KEY-----

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0/X+TAvD/qQt2+D40MDG

。。。。。。。。。。。。。。。。。

WwIDAQAB

-----END   PUBLIC KEY-----

 

使用公钥加密/解密/签名

使用私钥签名

~]#   openssl  rsautl -sign -inkey   myPrivateKey  -in  test.txt    -out test.sign -hexdump

 

[root@localhost   ~]# cat test.sign

0000   - 4f da 7e cb f6 97 79 f1-f5 15 61 9e a3 ab 17 20   O.~...y...a....

0010   - 94 1a 9b ce 8c 58 c8 89-f0 66 48 e9 72 86 31 64   .....X...fH.r.1d

0020   - 76 b4 c4 1f 87 fb a2 e4-4f ec 22 55 2d c1 9b 7a   v.......O."U-..z

0030   - a6 7d 61 44 22 90 24 d9-57 7f a2 2f da 4f a1 7f   .}aD".$.W../.O..

0040   - 40 f4 25 1b 44 81 14 90-cf b5 06 10 41 22 cb c7   @.%.D.......A"..

0050   - a9 0e b7 28 ac 08 18 0e-1c bc 9e 82 3d 11 27 b9   ...(........=.'.

0060   - 8b fd 9a 37 ed ce e1 9e-69 a0 05 70 6b 9e 08 e7   ...7....i..pk...

0070   - b5 cb 86 18 79 eb fb 5e-e7 46 03 a5 da df d8 e2   ....y..^.F......

0080   - 15 17 72 f3 78 33 23 5b-73 cc 7a ef e1 5e 81 6f   ..r.x3#[s.z..^.o

0090   - bf ab 23 38 2d 79 fb 3c-cc 0b 03 d8 7e 4b 01 b1   ..#8-y.<....~K..

00a0   - 8c 08 6b 3c 81 dc 34 3c-9f b0 78 2b c0 c7 1f b3   ..k<..4<..x+....

00b0   - 5f 3b d8 4e 02 a5 34 5c-51 06 4c cf cb bb ff e5   _;.N..4\Q.L.....

00c0   - a5 6e 97 8f 42 6e ed 08-68 58 05 40 5d 29 22 5c   .n..Bn..hX.@])"\

00d0   - ea e1 80 26 70 62 69 38-7c fb b0 38 c8 3b 95 7b   ...&pbi8|..8.;.{

00e0   - cf 77 5e 0b bb 8f c1 64-7f 09 9b e6 87 ce 57 d4   .w^....d......W.

00f0   - 4e 57 31 bb bb f7 96 9c-33 32 15 4b fb 9d 61 b1   NW1.....32.K..a.

 


使用公钥加密:

[root@localhost   ~]# openssl   rsautl -encrypt  -pubin -inkey   myPubKey  -in  test.txt -out  test.rsa.txt

 

[root@localhost   ~]# cat  test.rsa.txt

|©¿¤4#Kب



############