常用安全技術 3A: 認證:身份確認 授權:許可權分配 審計:監控做了什麼 安全通信 加密演算法和協議 對稱加密: 非對稱加密 單向加密:哈希(hash)加密 認證協議 對稱加密: 加密和解密使用的是同一個密鑰 是通過將原始數據分割成若幹塊來逐個進行加密 特點:效率高、速度快 缺點:加密解密使用的密鑰相 ...
常用安全技術
3A:
- 認證:身份確認
- 授權:許可權分配
- 審計:監控做了什麼
安全通信
加密演算法和協議
-
對稱加密:
-
非對稱加密
-
單向加密:哈希(hash)加密
-
認證協議
對稱加密:
-
加密和解密使用的是同一個密鑰
-
是通過將原始數據分割成若幹塊來逐個進行加密
-
特點:效率高、速度快
-
缺點:加密解密使用的密鑰相同,需要提前把密鑰發給別人且不能確定數據來自於發送方。
常見的對稱加密演算法:
-
DES:56位加密,把數據切成56Bit一塊來進行加密
-
3DES:DES的方式加密三次
-
AES:高級加密標準,密鑰長度是可變的。 (128, 192, 256bits)
-
Blowfish,Twofish
-
IDEA,RC6,CAST5
非對稱加密演算法:
-
密鑰成對出現,加密和解密用的密鑰不相同
-
通信雙方都需要各自的密鑰和私鑰
-
特點:公鑰加密、私鑰解密,可以確認數據的來源
公鑰:public key,公開給所有人,
私鑰:secret key,private key 私有的,必須保證其私密性,用於自已加密簽名
可以使用私鑰來加密、也可以使用公鑰來加密。
公鑰和私鑰是成對的,需要使用同一個人的鑰匙才能進行解密
數字簽名:採用私鑰來進行加密、使用公鑰來進行解密。(其他人的到的數據只能使用他的公鑰來解密,這樣就能確定數據的來源性)
非對稱加密的兩種使用場景:
數據安全:加密的數據只有自己能解開 --- 公鑰加密、私鑰解密
數據來源確認:確定數據的來源性 --- 私鑰加密、公鑰解密(實現數字簽名)
缺陷:複雜程度高
常見的非對稱加密常見演算法:
-
RSA:三個發明人首字母簡稱。加密和數字簽名都可以實現
-
DSA(Digital Signature Algorithm):數字簽名演算法,只能做來源確認,不能做數據加密。
-
ECC:橢圓曲線密碼編碼學,比RSA加密演算法使用更小的密鑰,提供相當的或更高等級的安全
對稱加密演算法適合加密大的數據
非對稱加密演算法合適加密小的數據
哈希(hash)演算法
-
哈希演算法又稱為散列演算法,是一種單向的加密演算法,是不可逆的。
-
哈希演算法算出來的結果叫做摘要(digest)。
-
哈希演算法固定時,摘要的長度是固定的大小,內容不同。摘要的內容由數據決定。
-
通過摘要無法推出原有數據的內容
使用場景:
哈希演算法:用來確認數據的完整性
類似於指紋,人不同,指紋就不同。得到指紋但是不知道他是誰。
可以用來檢查數據是否被篡改,因為數據不變,摘要也不會發生改變。
常用的哈希演算法
-
md5: 摘要是128bits字元 已經被破解了
-
sha1: 摘要是160bits字元 已經被破解了
-
sha224、sha256、sha384、sha512
兩個賬號的密碼一樣,但是得到的哈希摘要不一樣,這是因為為了保證信息的安全,在加密密碼之前加鹽(隨機字元串)處理,然後再進行加密。這樣就保證了同樣的密碼,生成的哈希摘要不一樣的原因。1
演算法的組合使用
數據加密的實現
-
採用對稱和非對稱密鑰的組合使用。
-
實現數據加密,無法驗證數據完整性和來源
張三先使用對稱加密來加密數據文件,然後使用李四的公鑰來加密這個對稱加密的密鑰文件。最後把這兩個文件發給李四。
李四收到這兩個文件後,先使用自己的私鑰解密加密的密鑰文件得到對稱加密的密鑰,最後使用這個密鑰來解密數據。
數字簽名的實現
不加密數據,可以保證數據來源的可靠性、數據的完整性和一致性
張三先使用哈希演算法得到一個摘要,摘要放在數據的後面,然後使用私鑰來加密這個摘要信息(數據沒加密)。然後把數據和數字簽名發給李四。
李四通過張三的公鑰來解密得到加密的摘要信息,然後再對數據使用相同的哈希演算法來進行加密。
最後對比兩個摘要是不是一樣。一樣就確定了數據是張三發來的。
加密和簽名的實現
即實現數據加密,又可以保證數據來源的可靠性、數據的完整性和一致性
方法一:使用這種方法實現,如果數據很大的話。效率就會很低
張三加密過程:先把數據使用哈希演算法得到一個摘要,然後使用私鑰進行加密得到簽名。把數據放在這個簽名的後面。
然後再使用接受者的公鑰將他們進行加密。
李四解密過程:首先使用自己的私鑰進行解開得到裡面的簽名和數據。然後使用同樣的哈希演算法對數據進行加密,並且使用張三的公鑰將張三發送過來的摘要解密
最後對比兩個摘要是都相同。
方法二:三種加密演算法的綜合使用
張三先使用哈希演算法將數據進行加密,將得到的摘要信息附加到數據後面,在使用自己的私鑰加密摘要信息的到數字簽名。
然後使用對稱加密的方式將他們全部加密,再使用李四的公鑰來加密這個對稱密鑰文件。
李四得到數據以後,首先通過自己私鑰解密得到對稱密鑰,然後再進行對稱解密得到數據和張三的數字簽名。
再通過張三的公鑰來解密這個簽名得到張三生成的摘要信息。再通過同樣的哈希演算法生成一個摘要。對比兩個摘要是否一樣。
密鑰交換
-
方法一:對稱密鑰發給對方:使用對方的公鑰加密,對方使用私鑰來進行解密。
-
方法二:DH演算法:生成對稱(會話)密鑰
CA和證書
-
PKI:Public Key Infrastructure 公共密鑰加密體系
-
簽證機構:CA(Certificate Authority),
-
註冊機構:RA
-
證書吊銷列表:CRL,存放被吊銷了的證書
CA的證書頒發過程:
A、B直接把公鑰發送給對方,因為存在中間人攻擊,所以誰也不敢信。後面就需要一個權威機構來進行擔保。
A、B的公鑰通過認證機構CA進行簽名(私鑰加密),簽名完以後加入一些其他信息,比如有限期、說明信息等。這樣就行成了一個證書。
例如A和B需要通信的時候,A就把自己的證書發送給通信的對方,B得到這個證書以後,通過CA公鑰的解密得到了A的公鑰。
根CA會給子CA頒發證書,子CA再給用戶頒發證書。
例如:B想要解開A發送給他的證書,就需要拿到CA1的公鑰,因為CA1的證書是根CA給的,所以根CA就有CA1的公鑰。B利用根CA個CA1頒發的證書,間接就得到了CA1的公鑰,就可以解開A的證書。
#任何一個主機(windows)都有最根上面的根CA的證書。(系統安裝以後就自帶的)
加密相關的一些安全協議
安全協議SSL\TLS
-
SSL:安全套接層,後來改名為TLS協議。
-
TLS: Transport Layer Security(傳輸層安全性協議),裡面集成和很多功能。
-
TLS是一個通用的協議,可以實現各種不加密協議的加密。
-
TLS協議的作用:用於在兩個通信應用程式之間提供保密性和數據完整性
HTTPS協議
http協議是不加密的,http協議+TLS協議就是https協議
HTTPS的通信過程:
服務端配置:會向指定CA組織申請證書
客戶端發送https請求
伺服器將自己的證書發送給客戶端
客戶端校驗證書的有效性(是否是權威CA頒發、是否過期等)
如果校驗通過,客戶端就使用服務端的公鑰(服務端發送過來的證書中有)生成一個隨機的key發送給服務端
服務端使用自己的私鑰來解密得到這個key
後面雙方就可以使用這個key(對稱密鑰來進行數據的傳輸)
openssl
-
openssl是一個開放源代碼的軟體庫包。
-
應用程式可以使用這個包來實現數據加密、身份確認等功能。
-
這個包廣泛被應用在互聯網的網頁伺服器上
openssl軟體包的組件:
libcrypto:用於實現加密和解密的庫
libssl:用於實現ssl通信協議的安全庫
openssl:多用途命令行工具 #最長用的一個組件,裡面的核心工具:openssl
Base64編碼
作用:實現編碼轉換的作用。實現把ascii碼中不可見的字元轉換為可見的字元
ascii中可見的字元有64個
ascii碼可見的字元:aA-zZ 0-9 = / 26+26+10+2=64
openssl命令
-
互動式(預設)
-
批處理:
查看openssl的版本
互動式:
[root@ubuntu1804 ~]#openssl
OpenSSL> version
批處理式:
root@ubuntu2004:~# openssl version
openssl命令實現對稱加密
enc:對稱加密演算法工具,實現對稱加密和解密
#命令格式
openssl enc -e -des3 -a -salt -in 需要加密的文件 -out 加密後的文件
-e:表示加密
-des3:表示使用3des這種非對稱加密演算法
-a:表示使用Base64進行編碼轉換
-salt:表示加鹽
-in:表示需要加密的文件
-out:後面存放加密生成的結果的文件
解密:把-e換成-d就行了
openssl enc -d -des3 -a -salt -in testfile.cipher -out testfile
-d:表示解密
openssl實現單向哈希加密
dgst:用於數據摘要,摘要就是使用哈希演算法單項加密得到的。
#格式
openssl 使用的加密演算法 需要加密的文件 #dgst可以省略
例如:openssl sha512 filename
#或者使用sha1sum| sha256sum | sha512sum filename 得到的值是一樣的,因為他們使用的演算法是一樣的。
[root@vms88 ~]# sha1sum aa
f572d396fae9206628714fb2ce00f72e94f2258f aa
[root@vms88 ~]# openssl sha1 aa
SHA1(aa)= f572d396fae9206628714fb2ce00f72e94f2258f
哈希演算法:md5, sha1, sha256,sha512…
openssl 命令生成用戶密碼
passwd:生成散列密碼。生成各種口令密文
格式:
openssl passwd --help
例如: openssl passwd -6 #會要求輸入兩次密碼且會自動添加對應的鹽,也可以人為指定鹽
#CentOS7也可以使用python來生成sha512加密的口令:
-6:表示採用sha512這種加密算嗎(Centos7上面沒有)
-5:sha256演算法
-1:md5演算法
openssl 生成隨機數
rand:生成隨機位元組
/dev/random:結合硬體信息來生成字元。隨機數用光了就會阻塞程式的執行
/dev/urandom:隨機數也是來自硬體,隨機數用光了會用軟體模擬生成偽隨機數。不會阻塞運行。
#使用rand子命令來實現隨機數的生成。
格式:
openssl rand -base64|-hex NUM
NUM: 表示位元組數,使用-hex,每個字元為十六進位,相當於4位二進位,出現的字元數為NUM*2
openssl rand -base64 10 隨機生成一個10個位元組的符號(位元組不是3的整數倍就會出現等號的情況,=號是用來占位的,四個位元組一組)
範例:隨機生成十個用戶,每個用戶分配一個隨機的密碼。
#!/bin/bash
for i in {1..10};do #{1..10}表示生成1..10的一個數字列表
id user$i &> /dev/null || useradd user$i #使用id命令查看用戶是否存在,不存在就創建這個用戶
passwd=`openssl rand -base64 10` #獲取到一個隨機密碼
echo $passwd | passwd user$i --stdin &> /dev/null #給生成的用戶指定密碼
echo user$i:$passwd >> user.txt #將密碼保存到一個指定文件
done
openssl命令實現 PKI
PKI:Public Key Infrastructure 公共密鑰加密體系
生成私鑰:
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE [指定的對稱加密演算法] [NUM_BITS,預設2048]
-out:表示生成私鑰的輸出文件名
# 也可以給生成的私鑰進行堆成加密
對稱加密演算法:man genrsa
-aes128, -aes192, -aes256, -aria128, -aria192, -aria256, -camellia128, -camellia192, -camellia256, -des, -des3, -idea
解密加密了的私鑰
如果在生成私鑰的時候採用堆成加密的方法加密了,解密的方法是:
#格式
openssl rsa -in 加密了的私鑰文件 -out 解密後的文件
公鑰是隱藏在私鑰內部的,可以通過私鑰的到公鑰。
#從私鑰中提取出公鑰
openssl rsa -in 私鑰文件 -pubout -out 提取出來保存的公鑰文件
建立私有CA實現證書申請頒發
建立私有CA的工具:
-
OpenCA
-
openssl
openssl的配置文件
/etc/pki/tls/openssl.cnf
openssl的這個配置文件主要是配置CA證書頒發和申請的一些配置信息。
配置文件說明
[ ca ]
default_ca = CA_default # 預設使用的CA
####################################################################
[ CA_default ]
dir = /etc/pki/CA # 存放和CA相關的文件的目錄(CentOS7這個文件預設存在)
certs = $dir/certs # 存放頒發的證書 Cert:證書
crl_dir = $dir/crl # 存放被吊銷的證書
database = $dir/index.txt # 存放ca的索引(需要人為創建)
new_certs_dir = $dir/newcerts # 存放新證書的位置
certificate = $dir/cacert.pem # ca的自簽名證書
serial = $dir/serial # 證書的編號(第一次需要人為創建並編號,後面會自動遞增) serial:連續的
crlnumber = $dir/crlnumber # 證書吊銷列表的編號
crl = $dir/crl.pem # 證書吊銷列表的文件
private_key = $dir/private/cakey.pem# CA的私鑰
x509_extensions = usr_cert # The extensions to add to the cert
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
policy = policy_match #指定使用的匹配策略
# For the CA policy
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
三種策略:
match匹配:用戶申請證書的時候必須和CA一致(國家,省份,組織)
optional可選
supplied提供
創建私有CA
-
創建對應文件
-
給自己頒發自簽名證書
1.創建CA相關文件
#創建CA所需要的文件:資料庫文件和證書索引文件
#database = $dir/index.txt # database index file.
#serial = $dir/serial # The current serial number
#生成證書索引資料庫文件 只需要創建文件就行,內容不需要手動維護
touch /etc/pki/CA/index.txt
#指定第一個頒發證書的序列號
echo 01 > /etc/pki/CA/serial
2.給CA頒發自己的證書
(1)生成CA的私鑰
#private_key = $dir/private/cakey.pem# The private key
cd /etc/pki/CA/
(umask 066; openssl genrsa -out private/cakey.pem 2048)
(2)生成CA的自簽名證書
#certificate = $dir/cacert.pem
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
#選項說明
-new:生成新證書簽署請求
-x509:表示證書的格式
-key:生成請求時用到的私鑰文件
-days n:證書的有效期限
-out /PATH/TO/SOMECERTFILE: 證書的保存路徑
範例:Centos8搭建私有CA
-
1.根據openssl對應的配置文件創建對應的文件
-
2.創建私鑰文件
-
3.生成自簽名證書
#創建對應的文件(CentOS7上面預設存在)
[root@centos8 ~]#mkdir -pv /etc/pki/CA/{certs,crl,newcerts,private}
#index.txt和serial文件在頒發證書時需要使用,所以需要提前創建
[root@centos8 ~]#touch /etc/pki/CA/index.txt
[root@centos8 ~]#echo 01 > /etc/pki/CA/serial
#在指定的位置創建CA的私鑰
[root@centos8 ~]#cd /etc/pki/CA/
[root@centos8 CA]#(umask 066; openssl genrsa -out private/cakey.pem 2048)
#給CA自己頒發自簽名的證書
[root@centos8 ~]#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days
3650 -out /etc/pki/CA/cacert.pem
#需要交互輸入國家、省、地區、組織等內容
#查看自簽名證書的信息
[root@centos8 ~]#openssl x509 -in /etc/pki/CA/cacert.pem -noout -text
-in:指定輸入的文件
-noout:不輸出為文件
-text:以文本方式來進行顯示
用戶實現證書的申請
-
1.用戶生成證書的私鑰,然後利用這個私鑰完成證書的申請
-
2.利用這個私鑰文件來生成證書申請文件(若是match這種策略。填寫的 國家 省 組織必須一致)
-
3.將生成的證書申請文件給CA,由CA頒發證書
採用match這種策略這三個選項必須保持一致,如果採用的是option這種策略的話就不用保持一致都可以
#生成私鑰文件
[root@centos8 ~]#(umask 066; openssl genrsa -out /data/app1/app1.key 2048)
#私鑰一般使用key作為尾碼要標識
#利用私鑰生成證書申請文件
[root@centos8 ~]#openssl req -new -key /data/app1/app1.key -out /data/app1/app1.csr
#證書申請文件的尾碼一般都是以csr為尾碼作為標識
#互動式輸入信息的時候 國家 省 組織不需要保持一致,其他隨意
#CA通過證書申請文件來頒發證書
[root@centos8 ~]#openssl ca -in /data/app1/app1.csr -out /etc/pki/CA/certs/app1.crt -days 1000
-in:輸入文件
-out:輸出文件
#查看頒發的證書文件
openssl x509 -in /etc/pki/CA/certs/app1.crt -noout -text
[root@Centos8 CA]# tree /etc/pki/CA
/etc/pki/CA
├── cacert.pem
├── certs
│ └── app1.crt #生成的證書文件
├── crl
├── index.txt
├── index.txt.attr
├── index.txt.old #前一個文件的備份
├── newcerts
│ └── 01.pem #和app1.crt是同一個東西,自動生成的一個備份文件
├── private
│ └── cakey.pem
├── serial
└── serial.old
#serial:存放的是下一個證書的證書編號
#查看證書的有效性
openssl ca -status 01 #01就是這個證書的標號
將證書相關文件發送到用戶端使用
#cp /etc/pki/CA/certs/app1.crt /data/app1/ #放到用戶端的指定位置
尾碼規定:
.crt #證書文件的標識
.csr #證書申請文件的標識 證書申請完成後,這個證書申請文件就沒啥用了
.key #私鑰的標識 .pem也是私鑰的標識,但是windows不是別pem結尾的文件
一個證書申請文件只能申請一次證書。
實現一個申請文件申請多個證書的方法;
[root@Centos8 CA]# cat index.txt.attr
unique_subject = yes #把yes變為no就可以了
證書的吊銷
例如:
openssl ca -revoke /etc/pki/CA/newcerts/11.pem
# 11.pem文件標識要吊銷的證書文件。
#查看證書的狀態 從index這個文件也能看出來 V:標識生效的 R:標識無效的證書
openssl ca -status 11
生成證書吊銷列表文件
公開被吊銷的文件。其他用戶可以獲取已經吊銷了的證書文件列表
#需要創建一個clinumer文件才可以 吊銷證書也需要一個吊銷證書的number 類似於index.txt
#這個文件預設不存在,需要手動創建出來
echo 01 > /etc/pki/CA/crlnumber
openssl ca -gencrl -out /etc/pki/CA/crl.pem #證書吊銷文件的路徑是約定好的