加密、解密的原理及Openssl創建CA和ssh的基礎應用
隨着互聯網的不斷髮展和技術的不斷成熟,在互聯網上傳輸文件不在安全,在需要傳送重要的數據時就必須加密處理。
密碼算法分爲三種:分別是對稱加密,公鑰加密,單向加密;以及需要對加密算法的認證,叫做認證協議。下面爲大家概述對稱加密,公鑰加密,單向加密及認證協議
對稱加密:
採用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱爲對稱加密,也稱爲單密鑰加密。 需要對加密和解密使用相同密鑰的加密算法。由於其速度快,對稱性加密通常在消息發送方需要加密大量數據時使用。對稱性加密也稱爲密鑰加密。所謂對稱,就是採用這種加密方法的雙方使用方式用同樣的密鑰進行加密和解密。
密鑰是控制加密及解密過程的指令。算法是一組規則,規定如何進行加密和解密。因此安全性不僅取決於加密算法本身,密鑰管理的安全性更是重要。因爲加密和解密都使用同一個密鑰,如何把密鑰安全地傳遞到解密者手上就成了必須要解決的問題。對稱加密固然能夠保證數據的機密性,但無法保證數據的完整性和可用性;當一臺PC機需要和衆多的設備通信時,就必須保持衆多密碼,因爲要保證唯一性。
常用的對稱加密有:DES: Data Encryption Standard(數據加密標準)、3DES、Blowfish 、Twofish 、IDEA 、RC6 、AES(128,192,256,384,512)、CAST5算法等
圖解:
加密的工具:
gpg openssl enc
使用命令:
# openssl enc -des3 -a -salt -in /path/from/somefile -out/path/to/somecipherfile
加密 -a:表示已base64的方式加密(對文本文件一般都用base64的方式)
# openssl enc -d-des3 -a -salt -in /path/from/somecipherfile -out /path/to/somefile
解密 -d:表示解密
例:
使用命令對ks.cfg文件加密,然後查看加密結果
然後刪除原文件,使用解密命令查看解密結果
非對稱加密(公鑰加密):
與對稱加密算法不同,非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。因爲加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法
特點:
私鑰加密的數據-->與之配對的公鑰解密 實現身份驗證
公鑰加密的數據-->與之配對的私鑰解密 實現數據的機密性
加密的數據是對稱加密的三個數量級,所以非對稱加密算法很少對數據進行加密,大部分用於密碼加密。
功能:
身份驗證、機密性、密鑰交換
常用的加密算法:
RSA, DSA,EIGamal
工具:
gpg, openssl rsautl
圖解:
使用命令:
例:#openssl genrsa -out/path/to/keyfile NUMBEROFBITS
生成密鑰
生成一個2048位的密鑰,追加存放在mykey中,但是創建完後的權限是所有用戶都可以看的,所有需要再次修改權限,也可以直接使用命令# (umask 077; openssl genrsa -out /path/to/keyfile NUMBEROFBITS )-out表示直接保存在文件中,不使用重定向
使用# openssl rsa -in /path/from/private_key_file –pubout命令提取公鑰
單向加密:
散列函數也叫做HASH函數,主流的散列算法有MD5與SHA-1、SHA256、SHA384、SHA512。散列函數的主要任務是驗證數據的完整性。通過散列函數計算得到的結果叫做散列值,這個散列值也常常被稱爲數據的指紋(Fingerprint)也叫數字簽名。基於單向加密機制,openssl還支持MAC,MAC是消息摘要碼,單向加密的一種延伸類的應用,能夠在不基於公鑰不加密的方式下,完成信息完整性認證。主要作用於實現在網絡通信中保證所傳輸的數據的完整性。實現MAC算法有兩種,分別是CBC-MAC和HMAC,其中HMAC比較簡單,使用的是md5或sha1算法。
特點:
輸入一樣,輸出必須相同
雪崩效應:輸入的微小改變,將會引起結果的巨大改變
定長輸出:無論原始數據是多大,結果大小都相同的
加密過程不可逆,無法根據特徵碼還原原來的數據
工具:
md5sum, sha1sum, openssl dgst, chsum
算法:
md5: 128bits、sha1: 160bits、sha256、sha384、sha512
使用命令:
# openssl dgst [-md5|-sha1] [-out/path/to/filename] /path/from/somefile
因爲三種加密算法都有自己的缺陷,也都有自己的優點,所以把三種算法都結合起來,安全性就大大的加強了,以下是實現過程:
理想完整的安全發送流程:
加密:
1、發送方使用選定的單向加密算法計算原始數據的特徵碼;
2、發送方使用自己的私鑰加密特徵碼,附加於原始數據後面;
3、)
4、發送方使用接收方的公鑰加密一次性對稱密鑰;附加於加密數據後面
解密:
1、接收方使用自己的私鑰解密加密的一次性對稱密鑰;
2、使用對稱密鑰解密數據,得到加密的特徵碼和原始數據;
3、使用發送方公鑰解密加密的特徵碼;
4、使用與發送方相同的單向加密算法重新計算數據的特徵碼,並與解密出的特徵作比較
(兩個主機進行通信時,當發送方先生成一個原始數據,先使用單向加密算法獲取其特徵碼,然後用自己的私鑰加密這段數據的特徵碼放在數據的後面;再生成一個臨時性的對稱密鑰,對整個數據做加密;再用對方的公鑰加密密碼並附加在加密數據的後面;然後發送給接收方。
接收方收到後用自己的私鑰去解密這段加密的數據,這個數據由於只有私鑰對應的公鑰才能解密,得到對稱密鑰信息,使用此對稱密鑰的信息解密單向加密的信息,使用對方的公鑰解密特徵碼,然後接收方使用同樣的單向算法計算特徵碼,並比較加密的結果和解密的結果是否一致,這就叫數據完整性驗證)
圖解:
但是如何合法的獲取對方的公鑰就變成這種模式最重要的一步,所有就必須有一個第三方的公信力機構來驗證。驗證過程就是要用對應給用戶頒發證書的CA的公鑰來解密CA後面的簽名,如果能解密就說明可證明是CA所頒發的;用戶使用解密出來的特徵碼對比自己加密出來的特徵碼是否一樣,如果一樣就可證明證書的完整性是沒問題的;驗證過後還要再查看證書的是否在可使用時間內,再檢查是否在吊銷庫中,如果都沒問題便可開始正常通信
Openssl建立私有CA
建立CA服務器:
1、生成密鑰
使用# (umask077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)命令生成密鑰
2、自簽證書
使用命令# openssl req-new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days100,發起證書籤署請求;然後在請求中填上必要信息
req:生成證書籤署請求
-news:新請求
-key /path/to/keyfile:指定私鑰文件
-x509:生成自簽署證書
-days n:有效天數
3、初始化工作環境(第一次配置服務時需要用到)
#touch /etc/pki/CA/{index.txt,serial}
#echo 01 > /etc/pki/CA/serial
節點申請證書
1、 節點生成請求
1) 生成密鑰對
2)生成證書籤署請求
2、 簽署證書
1)驗證證書中的信息
2)簽署證書
3)發送給用戶
因是在同一臺主機上,可直接簽署證書(*.crt表示是證書的後綴名);然後查看已經簽過的證書,然後發送給請求方即可
在另一臺節點上做簽署請求
生成密鑰對
在另一個節點生成證書籤署請求
在CA服務器上創建一個csr文件用以存放簽證請求
在另一個節點上將生成的證書籤署請求發送給CA服務器
在服務端簽署節點發來的請求
在服務器段簽署完後發送給節點
三、吊銷證書(當節點出現自己私鑰丟失的情況時需要吊銷證書)
1、 由節點請求吊銷
1)獲取證書serial(序列號)
#openssl x509 –in /path/to/certificate_file.crt –noout–serial-subject
2、 CA服務器
1) 根據節點提交的serial和sbuject信息來驗證與index.txt文件中的信息是否一致;
2) 吊銷證書
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
3) 生成吊銷證書的編號(如果是第一次吊銷需要生成編號)
#echo 00 > /etc/pki/CA/crlnumber
4) 更新證書吊銷列表
# cd /etc/pki/CA/crl
# openssl ca –gencrl crl/thisca.crl
如果需要查看吊銷列表,使用命令openssl crl –in /path/to/crlfile.crl –noout -text
Openssh的使用
OpenSSH是一組用於安全地訪問遠程計算機的連接工具。它可以作爲 rlogin、 rsh rcp 以及 telnet 的直接替代品使用。更進一步, 其他任何 TCP/IP 連接都可以通過 SSH 安全地進行隧道/轉發。 OpenSSH 對所有的傳輸進行加密, 從而有效地阻止了竊聽、 連接劫持, 以及其他網絡級的***。OpenSSH 由 OpenBSDproject 維護。
登錄過程和使用 rlogin 或 telnet 建立的會話非常類似。 在連接時, SSH 會利用一個密鑰指紋系統來驗證服務器的真實性。 只有在第一次連接時, 用戶會被要求輸入 yes。 之後的連接將會驗證預先保存下來的密鑰指紋。 如果保存的指紋與登錄時接收到的不符, 則將會給出警告。 指紋保存在~/.ssh/known_hosts 中,對於 SSH v2 指紋,則是 ~/.ssh/known_hosts2。
默認情況下, 較新版本的 OpenSSH 只接受 SSH v2 連接。 如果能用版本 2 則客戶程序會自動使用, 否則它會返回使用版本 1 的模式。 此外, 也可以通過命令行參數 -1 或 -2 來相應地強制使用版本 1 或 2。 保持客戶端的版本 1 能力是爲了考慮較早版本的兼容性。
openssh的客戶端組件:
ssh:配置/etc/ssh/ssh_config
ssh[username@]host [COMMAND]
ssh-l username host [COMMAND]
scp: 利用ssh協議在主機之間實現安全文件傳輸的工具
scp SRC1... DEST
分兩種情形:
1、源文件在本機,目標爲遠程
# scp/path/to/somefile... USERNAME@HOST:/path/to/somewhere
複製文件到另一臺主機的/tmp/目錄
2、源文件在遠程,本地爲目標
#scp USERNAME@HOST:/path/to/somewhere /path/to/somewhere
-r: 複製目錄時使用
-p: 保持源文件的元數據信息,包括mode和timestamp
-q: 靜默模式
sftp: 基於ssh的ftp服務
用法:sftpUSERNAME@HOST
使用sftp命令就可直接進行上傳下載
openssh的服務器端:sshd
配置文件:/etc/ssh/sshd_config
服務腳本:/etc/rc.d/init.d/sshd
腳本配置文件:/etc/sysconfig/sshd
sshd認證方式:
1、基於口令的認證;
2、基於密鑰的認證;
#ssh-keygen -t rsa
默認密鑰爲id_rsa,id_rsa.pub
1、 第一種方法
使用ssh-keygen –trsa命令生成
查看已經生成的文件
將文件發送給另一臺主機
創建ssh文件,將發送過來的文件追加至auehorized_keys中
然後使用原來的主機進行驗證
也可使用另一中更方便的方法
命令直接生成密鑰,不用交互式操作
-f /path/to/somefile: 密鑰文件保存位置
-P '': 指定oldpassword
然後使#ssh-copy-id -i .ssh/id_rsa.pub USERNAME@HOST命令直接將文件發送給另一臺主機,然後登錄即可