在這個危機四伏的互聯網中,如何確保數據能安全可靠的發生給對方呢?咱們收到的數據如何判斷是否完整?是否被竊聽?是否真正來自對方呢?咱們須要一種這樣安全服務來爲提供保障。html
安全機制:git
數據保密,使用祕鑰經過加密算法將數據加密且只能經過祕鑰解密算法
祕鑰交換,使用加密須要考慮如何將祕鑰安全傳給對方,經過交換機制可實現centos
數據完整性,經過單項加密算法提取數據的特徵碼/指紋,判斷數據是否完整安全
身份認證,數據交換前須要認證雙方的身份,一般使用證書認證網絡
訪問控制,可經過配置使數據分流,私密數據走特定的通道app
流量填充,有意投放些垃圾流量,加大被破解的難度ide
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數字證書標準,其內容以下:
在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ب |
############