#2.10.1 网络安全通信基础
在这个危机四伏的互联网中,如何确保数据能安全可靠的发生给对方呢?我们收到的数据如何判断是否完整?是否被窃听?是否真正来自对方呢?我们需要一种这样安全服务来为提供保障。
安全机制:
数据保密,使用秘钥通过加密算法将数据加密且只能通过秘钥解密
秘钥交换,使用加密需要考虑如何将秘钥安全传给对方,通过交换机制可实现
数据完整性,通过单项加密算法提取数据的特征码/指纹,判断数据是否完整
身份认证,数据交换前需要认证双方的身份,通常使用证书认证
访问控制,可通过配置使数据分流,私密数据走特定的通道
流量填充,有意投放些垃圾流量,加大被破解的难度
l 数据加密
加密类型通常有两类,对称加密和非对称加密。
对称加密,双方使用相同的秘钥进行加解密。
非对称加密,使用公钥加密,只能使用与其配对的私钥解密。
对称加密算法:
对称加密算法的工作过程:首先需要将数据分成同等大小的组,组大小由算法定义,然后使用加密算法+秘钥加密所有组,常见的加密算法有3DES,AES,RC4。
对称加密的优点在于算法公开,计算量小,效率高。
对称加密的缺点在于秘钥过多,每个回话都需要一个秘钥,不易管理;无法安全传输密码
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颁发证书的过程:
使用证书验证对方公钥是否可靠的原理:
a) 通信双发首先交换发送自己的证书
b) 接收方使用CA的公钥解密该证书的数字签名,获取证书的用户信息与单向加密使用算法。
c) 通过单向加密算法提取数据指纹,对比数字签名中的指纹信息,看是否一致
注:通常操作系统内置受信任CA的证书(内含公钥),如果没有CA的公钥说明此CA不被操作系统信任。
目前常用的证书为X.509数字证书标准,其内容如下:
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ب |
############