經常使用的加密算法和協議:web
一、對稱加密:加密和解密使用同一個密鑰;算法
特性:shell
一、加密、解密使用同一個密鑰;數據庫
二、將原始數據分割成爲固定大小的塊,逐個進行加密;安全
缺陷:服務器
一、密鑰過多;網絡
二、密鑰分發困難;架構
常見算法:DES、3DES、AES、Blowfish、Twofish、...併發
================================================================================dom
二、公鑰加密:也稱爲非對稱加密,密鑰分爲公鑰與私鑰
公鑰(public key):從私鑰中提取產生;可公開給全部人;
私鑰(secret key):經過工具建立,使用者本身留存,必須保證其私密性;;
特色:用公鑰加密的數據,只能使用與之配對兒的私鑰解密;反之亦然;
用途:
數字簽名:主要在於讓接收方確認發送方的身份;
密鑰交換:發送方用對方公鑰加密一個對稱密鑰,併發送給對方;
數據加密(不經常使用,比對稱加密要慢3個數量級,即10的3次方倍)
常見算法:RSA, DSA, ELGamal
(DSA僅能用於數字簽名;RSA既能用於數字簽名,也能實現數據的加密和解密)
================================================================================
三、單向加密:即提出數據指紋(特徵碼);只能加密,不能解密;
特性:定長輸出(密鑰長度固定);
雪崩效應(初始數據的微小改變將致使加密結果的巨大變化);
用途:完整性(用於實現數據的完整性驗證);
常見算法:md5(128bits)、sha1(160bits)、sha224, sha256, sha384, sha512
================================================================================
四、密鑰交換: IKE(Internet Key Exchange)
IKE常見的實現方法:
公鑰加密(完成密鑰交換)
DH算法(相比於公鑰加密,DH更爲經常使用;公鑰加密時公鑰是公開的,而DH算法不用將密鑰公開便可完成密鑰交換)
例如:A和B協商利用p和g加密,並有各自的私鑰x,y
A:p, g
B:p, g
A: x(僅A本身可見)--> p^x%g ==> B
A: (p^y%g)^x=p^yx%g
B: y(僅B本身可見)--> p^y%g ==> A
B: (p^x%g)^y=p^xy%g
密鑰交換經常使用的算法:RSA,DH(迪菲-赫爾曼),ECDH(橢圓曲線DH),ECDHE(臨時橢圓曲線DH)
================================================================================
例如:Alice向Bob發送數據的過程:
一、Alice利用單向加密計算出數據的特徵碼,並用本身的私鑰加密特徵碼附加在數據後,加密後的特徵碼即數字簽名;
二、Alice利用對稱加密,加密整段數據並生成密鑰,且利用Bob的公鑰將此密鑰加密;
三、Bob獲得加密的數據後,利用本身的私鑰解密,得出加密數據的密鑰並將其解密,然後獲得數據和加密的特徵碼:
1) Bob利用Alice的公鑰解密出數據的明文特徵碼(Alice的身份獲得驗證);
2) Bob利用一樣的單向加密算法計算出數據的特徵碼;
四、Bob將兩個特徵碼對比,若是同樣,則確保了數據的完整性(未被更改過),且在這個過程當中確保了數據的保密性並完成了密鑰交換
================================================================================
證書管理機構—CA
CA:Certificate Authority,CA是通訊雙方都信任的實體,被稱爲可信第三方,CA經過證書證明他人的公鑰信息,證書中綁定了公鑰數據、和相應私鑰擁有者的身份信息,並帶有CA的數字簽名。證書中也包含了CA的名稱,以便於依賴方找到CA的公鑰、驗證證書上的數字簽名。
公鑰基礎設施—PKI
PKI:Public Key Infrastructure,PKI是以CA爲核心提供公鑰加密和數字簽名服務的系統或平臺,目的是爲了管理密鑰和證書。CA是證書的簽發機構,是PKI的核心。
PKI的組成部分:
簽證機構:CA
註冊機構:RA
證書吊銷列表:CRL
證書存取庫:CB
X.509v3格式:定義了證書的結構以及認證協議標準
版本號
序列號
簽名算法ID
發行者名稱
有效期限
主體名稱
主體公鑰
發行者的唯一標識
主體的唯一標識
擴展
發行者的簽名(CA自簽名)
證書的驗證:
一、用CA的公鑰解密CA的數字簽名(驗證證書來源可靠);
二、用和數字簽名一樣的加密算法去加密證書,取得特徵碼,與解密出的特徵碼對比是否相同(驗證證書完整性可靠);
三、檢查證書的有效期限,過時則不予承認;
四、驗證主體名稱(驗證證書持有者的真實性),C/S架構中,主體名稱即主機名稱,客戶端請求的服務器的主機名和服務器持有的證書中的主體名稱必須一致;
五、檢查證書是否處於吊銷列表中
================================================================================
SSL及TLS
SSL(Secure Sockets Layer 安全套接層),及其繼任者TLS(Transport Layer Security 傳輸層安全),是爲網絡通訊提供安全及數據完整性的一種安全協議。
SSL:Secure sockets Layer(安全套接字層)
SSL協議位於TCP/IP協議與各類應用層協議之間,爲數據通信提供安全支持。
研發公司:Netscape: 1994
協議版本:V1.0, V2.0, V3.0
TLS: Transport Layer Security(傳輸層安全)
TLS是IETF(互聯網工程任務組)制定的一種新的協議,它創建在SSL 3.0協議規範之上,是SSL 3.0的後續版本。
研發組織:IETF: 1999
協議版本:V1.0, V1.1, V1.2, V1.3
TLS的分層設計:
一、最底層:基礎算法原語的實現,aes, rsa, md5
二、向上一層:各類算法的實現;
三、再向上一層:組合算法實現的半成品;
四、用各類組件拼裝而成的各類成品密碼學協議軟件;
SSL會話主要三步:
一、客戶端向服務器端索要並驗正證書;
二、雙方協商生成「會話密鑰」;
(前兩步一般被稱爲ssl會話的握手階段[ssl handshake])
三、雙方採用「會話密鑰」進行加密通訊;
SSL Handshake Protocol:
第一階段:ClientHello:
支持的協議版本,好比tls 1.2;
客戶端生成一個隨機數,稍後用於生成「會話密鑰」
支持的加密算法,好比AES、3DES、RSA;
支持的壓縮算法;
第二階段:ServerHello
確認使用的加密通訊協議版本,好比tls 1.2;
服務器端生成一個隨機數,稍後用於生成「會話密鑰」
確認使用的加密算法;
發送服務器證書;(若是服務器端須要驗證客戶端證書,還要向客戶端發起請求)
第三階段:
客戶端驗正服務器證書(發證機構、證書完整性、證書持有者、證書有效期、吊銷列表),在確認無誤後取出其公鑰;
發送如下信息給服務器端:
1)一個隨機數(用於服務器進行公鑰加密);
2)編碼變動通知,表示隨後的信息都將用雙方商定的加密算法和密鑰發送;
3)客戶端握手結束通知;
第四階段:
服務器端收到客戶端發來的總過程的第三個隨機數pre-master-key後,計算生成本次會話所用到的「會話密鑰」;
向客戶端發送以下信息:
1)編碼變動通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送;
2)服務端握手結束通知;
================================================================================
安全協議的開源實現:OpenSSL
OpenSSL由三部分組成:
libencrypto庫 (加密解密庫,用於實現加密解密)
libssl庫 (用於實現ssl安全通訊機制的庫)
openssl(多用途命令行工具 )
libcrypto和libssl主要由開發者使用
openssl支持衆多子命令,主要分爲三類:
1)標準命令
2)消息摘要命令(dgst子命令相關)
3)加密命令(enc子命令相關)
查看openssl版本號以及獲取openssl相關命令提示(openssl錯誤就會提示):
標準命令: enc, ca, req, genrsa, ...
對稱加密:
工具:openssl enc, gpg
支持的算法:3des, aes, blowfish, towfish
enc命令:
[-e 加密算法] [-d 解密算法] [-a表示使用base64位文本編碼格式]
[-salt表示加入雜質] [-in 加密前文件] [-out 指明加密後的文件]
加密:~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
解密:~]# openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab
---
單向加密:
工具:openssl dgst, md5sum, sha1sum, sha224sum, ...
dgst命令:~]# openssl dgst -md5 /PATH/TO/SOMEFILE [-md5表示使用md5算法]
例如使用同種單向加密算法計算出的文件的特徵碼是相同的
生成用戶密碼:
工具:passwd, openssl passwd
openssl passwd -1 -salt SALT [-1表示使用md5加密算法] [-salt 雜質應該用隨機數]
單向加密的雪崩效應:
生成隨機數:
工具:openssl rand [NUM 指定隨機數的個數]
~]# openssl rand -hex NUM [-hex表示使用16進制數字編碼]
~]# openssl rand -base NUM [-base表示使用base64位文本格式編碼]
---
使用相同的雜質計算一樣的密碼獲得的結果是相同的:
公鑰加密:
加密解密:
算法:RSA,ELGamal
工具:openssl rsautl, gpg
數字簽名:
算法:RSA, DSA, ELGamal
工具:openssl rsautl, gpg
密鑰交換:
算法:DH
生成公鑰加密的密鑰對:
生成私鑰:(umask 077)表示在子shell中運行命令,即臨時生成的私鑰的文件權限爲600
~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
從私鑰中提取公鑰: [NUM_BITS表示指定的密鑰長度,必須是2的n次方倍]
~]# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
從私鑰中提取公鑰:
================================================================================
Linux系統上的隨機數生成器:
/dev/random:僅從熵池返回隨機數;隨機數用盡則阻塞進程獲取隨機數,等待隨機數產生;
/dev/urandom:從熵池返回隨機數;隨機數用盡,會利用軟件生成僞隨機數,非阻塞;僞隨機數不安全;
熵池:運行中的內核在內存中維護的一段有大量隨機數的空間;
熵池中隨機數的來源:
硬盤IO中斷時間間隔;
鍵盤IO中斷時間間隔;
熵池中的隨機數耗盡時可經過複製大文件(硬盤IO)產生大量隨機數
CA:
1)公共信任的CA;
2)私有CA(僅用於有限範圍內通訊);
創建私有CA的工具:
1)openssl命令
2)OpenCA(功能更增強大、健全的CA工具)
openssl命令:
配置文件:/etc/pki/tls/openssl.cnf
構建私有CA:
在肯定要配置爲CA的服務器上生成一個自簽證書,併爲CA提供所須要的目錄及文件便可;
步驟:
(1) 生成私鑰;
~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
私鑰默認要求放在/etc/pki/CA/private目錄下,且配置文件中默認定義了私鑰的文件名爲cakey.pem
(2) 生成自簽證書;
~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
req:證書請求生成的工具;
-new:生成新證書籤署請求;
-x509:生成自籤格式證書,專用於建立私有CA時;
-key:生成請求證書時用到的私有文件路徑;
-out:生成的請求文件路徑;若是是自籤操做將直接生成簽署過的證書;
-days:證書的有效時長,單位是day;
自簽證書在配置文件中默認定義了路徑爲/etc/pki/CA/private/cacert.pem
申請證書需填寫的信息:
國家代碼名稱
所在州或省
城市名稱
公司或組織名稱
部門名稱
我的名稱或主機名稱
管理員郵箱地址(能夠爲空)
(3) 爲CA提供所需的目錄及文件;
~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts} [若是存在則不用建立]
~]# touch /etc/pki/CA/{serial,index.txt} [serial序列號;index.txt數據庫文件]
~]# echo 01 > /etc/pki/CA/serial [serial文件中需指定第一個證書的序列號]
================================================================================
要用到證書進行安全通訊的服務器,須要向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
注意:若是是web服務器,證書申請時填寫的名字必須與服務器的主機名一致!
(3) 將請求經過可靠方式發送給CA主機;
例如這裏是測試,經過scp命令將證書籤署請求複製到CA主機上
(4) 在CA主機上籤署證書;
~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
CA簽署證書後便可在index.txt中看到證書的序列號等信息,V表示證書已籤
CA簽署證書後就能夠將證書發送給請求的主機,獲得證書的主機獲得crt文件後就可使用CA簽名後的證書了,csr文件便可刪除之以防信息泄露
查看證書中的信息:(擁有證書的CA主機和客戶端主機均可以查看證書信息)
~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
[-in 證書文件] [-noout -serial -subject表示只看序列號和證書持有者主題信息]
================================================================================
吊銷證書:(當客戶端的密鑰丟失時,CA須要將客戶端的證書吊銷)
步驟:
(1) 客戶端獲取要吊銷的證書的serial(在使用證書的客戶端主機執行):
~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
(2) CA主機吊銷證書
先根據客戶提交的serial和subject信息,對比其與本機數據庫index.txt中存儲的是否一致;
吊銷:其中的SERIAL要換成證書真正的序列號;
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
(3) 生成吊銷證書的吊銷編號(第一次吊銷證書時執行)
# echo 01 > /etc/pki/CA/crlnumber
(4) 更新證書吊銷列表
# openssl ca -gencrl -out thisca.crl
查看crl文件:
# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text