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加密演演算法使用更小的金鑰,提供相當的或更高等級的安全
對稱加密演演算法適合加密大的資料
非對稱加密演演算法合適加密小的資料
雜湊演演算法又稱為雜湊演演算法,是一種單向的加密演演算法,是不可逆的。
雜湊演演算法算出來的結果叫做摘要(digest)。
雜湊演演算法固定時,摘要的長度是固定的大小,內容不同。摘要的內容由資料決定。
通過摘要無法推出原有資料的內容
使用場景:
雜湊演演算法:用來確認資料的完整性
類似於指紋,人不同,指紋就不同。得到指紋但是不知道他是誰。
可以用來檢查資料是否被篡改,因為資料不變,摘要也不會發生改變。
md5: 摘要是128bits字元 已經被破解了
sha1: 摘要是160bits字元 已經被破解了
sha224、sha256、sha384、sha512
兩個賬號的密碼一樣,但是得到的雜湊摘要不一樣,這是因為為了保證資訊的安全,在加密密碼之前加鹽(隨機字串)處理,然後再進行加密。這樣就保證了同樣的密碼,生成的雜湊摘要不一樣的原因。1
採用對稱和非對稱金鑰的組合使用。
實現資料加密,無法驗證資料完整性和來源
張三先使用對稱加密來加密資料檔案,然後使用李四的公鑰來加密這個對稱加密的金鑰檔案。最後把這兩個檔案發給李四。
李四收到這兩個檔案後,先使用自己的私鑰解密加密的金鑰檔案得到對稱加密的金鑰,最後使用這個金鑰來解密資料。
不加密資料,可以保證資料來源的可靠性、資料的完整性和一致性
張三先使用雜湊演演算法得到一個摘要,摘要放在資料的後面,然後使用私鑰來加密這個摘要資訊(資料沒加密)。然後把資料和數位簽章發給李四。
李四通過張三的公鑰來解密得到加密的摘要資訊,然後再對資料使用相同的雜湊演演算法來進行加密。
最後對比兩個摘要是不是一樣。一樣就確定了資料是張三發來的。
即實現資料加密,又可以保證資料來源的可靠性、資料的完整性和一致性
方法一:使用這種方法實現,如果資料很大的話。效率就會很低
張三加密過程:先把資料使用雜湊演演算法得到一個摘要,然後使用私鑰進行加密得到簽名。把資料放在這個簽名的後面。
然後再使用接受者的公鑰將他們進行加密。
李四解密過程:首先使用自己的私鑰進行解開得到裡面的簽名和資料。然後使用同樣的雜湊演演算法對資料進行加密,並且使用張三的公鑰將張三傳送過來的摘要解密
最後對比兩個摘要是都相同。
方法二:三種加密演演算法的綜合使用
張三先使用雜湊演演算法將資料進行加密,將得到的摘要資訊附加到資料後面,在使用自己的私鑰加密摘要資訊的到數位簽章。
然後使用對稱加密的方式將他們全部加密,再使用李四的公鑰來加密這個對稱金鑰檔案。
李四得到資料以後,首先通過自己私鑰解密得到對稱金鑰,然後再進行對稱解密得到資料和張三的數位簽章。
再通過張三的公鑰來解密這個簽名得到張三生成的摘要資訊。再通過同樣的雜湊演演算法生成一個摘要。對比兩個摘要是否一樣。
方法一:對稱金鑰發給對方:使用對方的公鑰加密,對方使用私鑰來進行解密。
方法二:DH演演算法:生成對稱(對談)金鑰
PKI:Public Key Infrastructure 公共金鑰加密體系
簽證機構:CA(Certificate Authority),
序號產生器構:RA
證書吊銷列表:CRL,存放被吊銷了的證書
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協定。
TLS: Transport Layer Security(傳輸層安全性協定),裡面整合和很多功能。
TLS是一個通用的協定,可以實現各種不加密協定的加密。
TLS協定的作用:用於在兩個通訊應用程式之間提供保密性和資料完整性
http協定是不加密的,http協定+TLS協定就是https協定
伺服器端設定:會向指定CA組織申請證書
使用者端傳送https請求
伺服器將自己的證書傳送給使用者端
使用者端校驗證書的有效性(是否是權威CA頒發、是否過期等)
如果校驗通過,使用者端就使用伺服器端的公鑰(伺服器端傳送過來的證書中有)生成一個隨機的key傳送給伺服器端
伺服器端使用自己的私鑰來解密得到這個key
後面雙方就可以使用這個key(對稱金鑰來進行資料的傳輸)
openssl是一個開放原始碼的軟體庫包。
應用程式可以使用這個包來實現資料加密、身份確認等功能。
這個包廣泛被應用在網際網路的網頁伺服器上
libcrypto:用於實現加密和解密的庫
libssl:用於實現ssl通訊協定的安全庫
openssl:多用途命令列工具 #最長用的一個元件,裡面的核心工具:openssl
作用:實現編碼轉換的作用。實現把ascii碼中不可見的字元轉換為可見的字元
ascii中可見的字元有64個
ascii碼可見的字元:aA-zZ 0-9 = / 26+26+10+2=64
互動式(預設)
批次處理:
互動式:
[root@ubuntu1804 ~]#openssl
OpenSSL> version
批次處理式:
root@ubuntu2004:~# openssl version
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:表示解密
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…
passwd:生成雜湊密碼。生成各種口令密文
格式:
openssl passwd --help
例如: openssl passwd -6 #會要求輸入兩次密碼且會自動新增對應的鹽,也可以人為指定鹽
#CentOS7也可以使用python來生成sha512加密的口令:
-6:表示採用sha512這種加密算嗎(Centos7上面沒有)
-5:sha256演演算法
-1:md5演演算法
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
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 提取出來儲存的公鑰檔案
OpenCA
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所需要的檔案:資料庫檔案和證書索引檔案
#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
#private_key = $dir/private/cakey.pem# The private key
cd /etc/pki/CA/
(umask 066; openssl genrsa -out private/cakey.pem 2048)
#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: 證書的儲存路徑
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 #證書吊銷檔案的路徑是約定好的