一、加密解密技術基礎
(一) 安全的目標:
1.保密性,confidentiality
2.完整性,integrity
系統完整性,數據完整性
3.可用性,avaliability
(二) ***類型:
1. 威脅保密性的***:竊聽、通信量分析
2. 威脅完整性的***:更改、僞裝、重放、否認
3. 威脅可用性的***:拒絕服務(DoS)
(三) 解決方案:
技術(加密和解密)、服務(用於抵禦***的服務以及爲了實現上述目標而特地設計的安全服務)
1. 加密和解密
傳統加密方法:替代加密算法、置換加密算法
現代加密方法:現代塊加密方法、
2. 服務:
認證機制
訪問控制機制
3. 密鑰算法和協議
(1) 對稱加密:加密和解密使用同一個密鑰
算法:
DES:Data Encryption Standard
3DES:Triple DES
AES:Advanced Encryption Standard(128bits,192bits,256bits,384bits)
Blowfish
Twofish
IDEA
RC6
CAST5
特性:
加密、解密使用同一個密鑰
將原始數據分隔成爲固定大小的塊,逐個進行加密
缺陷:
密鑰過多,作爲服務器,要與很多客戶端通信的話,就必須給每個客戶端一個密鑰。
密鑰分發困難
(2) 公鑰加密:密鑰成對出現,分爲公鑰和與之配對的私鑰
公鑰:pubkey,從私鑰中提取產生,可公共給所有人
私鑰:secret key,通過公鑰加密解密工具創建,使用者自己留存,必須保證其私密性
特點:用公鑰加密的數據只能使用與之配對的私鑰解密,反之亦然
用途:
數字簽名:主要在於讓接收方確認發送方的身份,身份認證
密鑰交換:發送方用對方公鑰加密一個對稱密鑰,併發送給對方
數據加密(比對稱加密要慢3個數量級,不常用)
算法:RSA,DSA,ELGamal
DSS:Digital Signature Standard
DSA:Digital Signature Algorithm
(3) 單向加密:提取數據指紋(特徵碼)只能加密不能解密
特性:定長輸出、雪崩效應
功能:數據完整性驗證
算法:
md5:Message Digest 5,128bits
sha1:Secure Hash Algorithm 1,160bits
sha224,sha256,sha384,sha512
(4) 密鑰交換:IKE(Internet Key Exchange)
二、 PKI:Public Key Infrastructure,公共基礎設施
(一) 四個組件:
簽證機構:CA
註冊機構:RA
證書吊銷列表:CRL
證書存取庫:
(二) X.509v3:定義了證書的結構以及認證協議標準
證書版本號
序列號
簽名算法ID
發行者名稱(CA自己的名稱)
有效期限
主體名稱(個人名稱)
主體公鑰
發行者的唯一標識(CA的唯一標識)
主體的唯一標識(個人的唯一標識)
擴展
發行者的簽名
三、 SSL會話
(一)主要有三步
1. 客戶端向服務器索要並驗證證書;
2.雙方協商生成“會話密鑰”;
前兩步稱爲握手階段
3.雙方採用“會話密鑰”進行加密通信
(二) SSL Handshake Protocol,執行流程
第一階段:ClientHello:客戶端發送請求
(1) 客戶端向服務器端發送支持的協議版本,比如tls 1.2
(2) 客戶端生成一個隨即數,用於稍後用戶生成“會話密鑰”
(3) 客戶端發送自己支持的加密算法:比如:AES,RSA
(4) 支持的壓縮算法
第二階段:ServerHello:服務器端迴應請求
(1) 確認使用的加密通信協議版本,比如tls 1.2
(2) 服務器端生成一個隨機數,用於稍後生成“會話密鑰”
(3) 確認使用的加密方法
(4) 服務器發送自己使用的證書
(索要客戶端證書,一般不會索要,除非在特定的場景中)
第三階段:
(1) 客戶端收到服務器端迴應,先驗證服務器證書(發證機構、證書完整性、證書持有者、證書有效期、吊銷列表),在確認無誤後取出其公鑰
(2) 客戶端發送以下信息給服務器端
一個隨機數,用於服務器公鑰加密
編碼變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送
客戶端握手結束通知
第四階段:
(1) 服務器收到客戶端發來的第三個隨機數pre-master-key後,計算生成本次會話所用到的“會話密鑰”
(2) 服務器向客戶端發送如下信息
編碼變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送
服務器端握手結束通知
四、OpenSSL
(一) 組件:
1. libcrypto,ibssl主要由開發者使用
2.openssl:多用於命令行工具
(二) openssl的衆多子命令:
1. 標準命令:Standard commands
enc,ca,req,genrsa
2.消息摘要命令:Message Digest commands
dgst子命令
3. 加密命令:Cipher commands
enc子命令
(三) 標準命令
1. 對稱加密:
工具:openssl enc,gpg
支持的算法:3des, aes, blowfish, towfish
enc命令:
加密:~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
解密:~]# openssl enc -d -des3 -a salt -out fstab -in fstab.ciphertext
2. 單向加密
工具:openssl dgst,md5sum,sha1sum,...
dgst命令:計算特徵碼
~]# openssl dgst -md5 /PATH/TO/SOMEFILE
~]# md5sum /PATH/TO/SOMEFILE
只要使用的是同一個加密算法,特徵碼將會是一樣的,只是顯示的格式有所不同
3. 生成用戶密碼:
工具:passwd,openssl passwd
~]# openssl passwd -1 -salt SALT
4. 生成隨機數
工具:openssl rand
(1) ~]# openssl rand -hex NUM
表示16進制的編碼,NUM字節數
(2) ~]# openssl rand -base64 NUM
結果後面有==,是固定格式,真正使用的時候要去掉==
5. 公鑰加密:
加密解密
算法:RSA,ELGamal
工具:openssl rsautl,gpg
6. 加密過程:
(1) 發送方發送數據給接收方,發送方先用單向加密算法計算出這段數據的特徵碼,然後用自己的私鑰加密這段特徵碼生成數字簽名,附加到這段數據後面,從而可以確保自己的身份以及數據的完整性得到驗證,但是數據的保密性得不到驗證。
(2) 發送方自己使用對稱加密算法生成一個臨時的對稱密鑰,用對稱加密算法結合密鑰加密整段數據,包括原始數據以及加密過的特徵碼。
(3) 爲了保證接收方能夠解密,然後發送方會用接收方的公鑰加密剛纔的臨時密鑰並附加到加密密碼後面,把整個的數據發送給接收方。
7. 解密過程:
(1) 接收方收到這段數據之後,先用與接收方加密數據的公鑰配對的私鑰解密解密加密的對稱密鑰
(2) 得到對稱密鑰,然後用對稱密鑰解密整個這段數據
(3) 用發送方的公鑰解密這段數據後面附加的特徵碼,能解密的話,發送方的身份得到驗證
(4) 接收方用同樣的對稱算法計算這段數據的特徵碼,並與解密出來的特徵碼進行比較,如果相同數據完整性得到了驗證。
這樣的話數據的完整性、保密性以及發送方身份得到驗證。
8. 數字簽名
算法:RSA,DSA,ELGamal
工具:openssl rsautl,gpg
數字簽名的實現方式:
身份認證過程中就依賴了數字簽名,發送方用自己的私鑰加密數據特徵碼得到的結果就是數字簽名.
9. 密鑰交換
算法:DH
密鑰交換的實現方式:
發送方自己生成密鑰,然後用對方的公鑰加密這段數據,然後發送給接收方,只有接收方的私鑰才能夠解密,解密出來以後就可以得到發送方自己生成的密鑰,然後就可以解密數據,以後雙發的通信就一直使用這個密鑰。
10. 生成密鑰:
(1) 生成私鑰:~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
使用umask 077是爲了讓生成的私鑰只能自己讀寫,其他任何人都沒有任何權限
把命令放到()裏面是爲了讓命令在子shell裏面運行,umask命令只對子shell有效,將不會影響當前shell的以後的操作.
NUM_BITS:位長,必須是2^n,比如512,1024,2048...
(2) 提出公鑰:~]# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
11.Linux系統上的隨機數生成器
(1) /dev/random:僅從熵池返回隨機數,隨機數用盡,阻塞
(2) /dev/urandom:從熵池返回隨機數,隨機數用盡,會利用軟件生成僞隨機數,非阻塞
僞隨機數不安全
熵池中隨機數的來源
硬盤IO中斷時間間隔
鍵盤IO中斷時間間隔
五、 CA:
(一) 種類
公共信任CA
私有CA
(二) 建立私有CA的工具
openssl
OpenCA
(三) CA的驗證:
1.用CA的公鑰解密CA的簽名,能解密說明CA的來源可靠
2.用同樣的加密算法加密數據取得特徵碼,與解密出來的特徵碼對比,如果一樣說明證書完整性得到驗證
3.檢查證書的有效期限是否過期
4.驗證證書主體名稱與你要通信的主體的名稱是否一致
5.檢查證書是否被吊銷
(四) openssl命令:
1. 配置文件:/etc/pki/tls/openssl.conf
2. 構建私有CA:
在確定配置爲CA的服務器上生成一個自簽證書,併爲CA提供所需要的目錄及文件即可
3. 完整步驟:
生成私鑰:
~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
生成自簽證書:
~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
-new:生成新證書籤署請求
-x509:生成自籤格式證書,專用於創建私有CA時使用
-key:生成請求時用到的私有文件路徑
-out:生成的請求文件路徑,如果是自籤操作將直接生成簽署過的證書
-days:證書的有效時長
爲CA提供所需的目錄及文件
~]# mkdir -v /etc/pki/CA/{certs,crl,newcerts}
如果自動生成就不用再自己手動創建
~]# touch /etc/pki/CA/{serial,index.txt}
~]# echo 01 > /etc/pki/CA/serial
4.要用到證書進行安全通信的服務器,需要向CA請求籤署證書
步驟:以httpd爲例
1.用到證書的主機生成私鑰
~]# mkdir /etc/httpd/ssl
~]# cd /etc/httpd/ssl
~]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
2.生成證書籤署請求
~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
3.將請求通過可靠方式發送給CA主機
~]# scp http.csr [email protected]:/tmp/
4.在CA主機上籤署證書
~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
查看證書中的信息
~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject