Linux基礎中的加密、解密及openssl
數據爲何要加密?
因爲互聯網剛開始時使用的人很是少,在互聯網中交流信息的人都比較「單純」幾乎沒有安全問題;但隨着互聯網的快速發展,整個互聯網中涌入了大量的用戶,正所謂林子大了什麼鳥都有,隨之而來的就是數據的安全性得不到保障;所以就有了對數據的加密及解密。
安全的目標
信息加密的目的是爲了確保所傳輸的信息具備保密性,不被其餘人所劫持後篡改信息;若是被篡改後接收方也應該能知道,並且也應該確保沒被劫持的信息接收方能夠讀取。
加密算法
加密在很早以前就已經存在。遠在計算機還沒問世以前世界上就已經出現了,例如中國古代的虎符和信牌,或者礬書等。到如今爲止密碼或加密技術已經普遍應用在生活中的各類場景中,尤爲是在這個互聯網時代中加密技術更是發展到了極致
html
對稱加密
通訊雙方使用同一個密鑰對明文進行加密和解密。這樣就確保了就算是通訊的信息被第三方知道,因爲沒有密鑰也不能解密被加密的信息;這種加密方法確保了數據的安全性,但使用的密鑰必須由安全的方式在兩方之間傳輸。
公鑰加密
公鑰加密也稱非對稱加密,密鑰分爲私鑰和公鑰。其中公鑰是從私鑰中提取的。並且加密解密的方式是:公鑰加密必須用與之對應的私鑰來解密,反之亦然;
通常私鑰只有加密者自己具備,對應的公鑰全部人均可以獲得。公鑰加密主要能夠實現對身份的驗證。例如,A用私鑰加密一個文件要送給B,B接受到後只有用與A的私鑰相對於的公鑰解密,若是能解密則說明這個文件是A發送的。
單向加密
單向加密的特色是隻能加密不能解密。並且這種加密算術也稱爲hash散列函數,這種算法會把不一樣長度的數據壓縮成固定長度的一段字符。
這種加密方法通常用來驗證數據的完整性。發送方用單向加密加密數據後會獲得一個特徵碼,接收方收到數據後也用一樣的算法加密數據也獲得一個特徵碼。把這兩個特徵碼做比較若是相同則說明數據沒有被改動過。
轉自【IT精英團】:http://www.itnpc.com/news/web/145238462635582.html web
加密算法和協議:算法
對稱加密:數據加密(保密性),(3DES,AES)數據庫
公鑰加密:身份認證、密鑰交換、數據加密(不經常使用,比對稱加密要慢3個數量級),(RSA,DSA)安全
單向加密:數據完整性,(MD5, SHA1, ...)服務器
密鑰交換: RSA,DH(迪菲-赫爾曼),ECDH(橢圓曲線DH),ECDHE(臨時橢圓曲線DH)session
SSL/TLSdom
SSL: 安全套接字層(ssl 1.0, ssl 2.0, ssl 3.0)ide
TLS:傳輸層安全 (tls 1.0, tls 1.1, tls 1.2, tls 1.3)函數
開始加密通訊以前,客戶端和服務器首先必須創建鏈接和交換參數,這個過程叫作握手(handshake)。
假定客戶端叫作愛麗絲,服務器叫作鮑勃,整個握手過程能夠用下圖說明(點擊看大圖)。
握手階段分紅五步。
第一步,愛麗絲給出協議版本號、一個客戶端生成的隨機數(Client random),以及客戶端支持的加密方法。
第二步,鮑勃確認雙方使用的加密方法,並給出數字證書、以及一個服務器生成的隨機數(Server random)。
第三步,愛麗絲確認數字證書有效,而後生成一個新的隨機數(Premaster secret),並使用數字證書中的公鑰,加密這個隨機數,發給鮑勃。
第四步,鮑勃使用本身的私鑰,獲取愛麗絲髮來的隨機數(即Premaster secret)。
第五步,愛麗絲和鮑勃根據約定的加密方法,使用前面的三個隨機數,生成"對話密鑰"(session key),用來加密接下來的整個對話過程。
SSL Handshake Protocol:
第一階段:ClientHello:
支持的協議版本,好比tls 1.2;
客戶端生成一個隨機數,稍後用戶生成「會話密鑰」
支持的加密算法,好比AES、3DES、RSA;
支持的壓縮算法;
第二階段:ServerHello
確認使用的加密通訊協議版本,好比tls 1.2;
服務器端生成一個隨機數,稍後用於生成「會話密鑰」
確認使用的加密方法;
服務器證書;
第三階段:驗正服務器證書,在確認無誤後取出其公鑰;(發證機構、證書完整性、證書持有者、證書有效期、吊銷列表)
發送如下信息給服務器端:
一個隨機數;
編碼變動通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送;
客戶端握手結束通知;
第四階段:收到客戶端發來的第三個隨機數pre-master-key後,計算生成本次會話全部到的「會話密鑰」;
向客戶端發送以下信息:
編碼變動通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送;
服務端握手結束通知;
Linux系統上的隨機數生成器:
/dev/random:僅從熵池返回隨機數;隨機數用盡,阻塞;
/dev/urandom:從熵池返回隨機數;隨機數用盡,會利用軟件生成僞隨機數,非阻塞;
僞隨機數不安全;
熵池中隨機數的來源:
硬盤IO中斷時間間隔;
鍵盤IO中斷時間間隔;
PKI是Public KeyInfrastructure的首字母縮寫,翻譯過來就是公鑰基礎設施;PKI是一種遵循標準的利用公鑰加密技術爲電子商務的開展提供一套安全基礎平臺的技術和規範。
PKI:公鑰基礎設施
簽證機構:CA
註冊機構:RA
證書吊銷列表:CRL
證書存取庫
CA是PKI的核心,負責管理PKI結構下的全部用戶的證書。通訊雙方認證對方身份必需要經過CA。
經常使用的證書格式是 x509 格式,它包含有下面的信息:
版本號(version)
序列號(serial number),CA 用於惟一標誌此證書
簽名算法標誌(signatur algotithm ientifier)
發行者的名稱,即 CA 本身的名稱
有效期,起始日期和終止日期
主體本身的公鑰
發行商的惟一標識
整數主題的惟一標誌
擴展信息
簽名:CA 對此證書的數字簽名
ssl組件:
libcrypto, libssl主要由開發者使用;
openssl:多用途命令行工具;
openssl:
從多子命令,分爲三類:
標準命令
消息摘要命令(dgst子命令)
加密命令(enc子命令)
標準命令: enc, ca, req, genrsa, ...
對稱加密:
工具: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
單向加密:
工具:openssl dgst, md5sum, sha1sum, sha224sum, ...
dgst命令:
~]# openssl dgst -md5 /PATH/TO/SOMEFILE
生成用戶密碼:
工具:passwd, openssl passwd
openssl passwd -1 -salt SALT
生成隨機數:
工具:openssl rand
~]# openssl rand -hex NUM
~]# openssl rand -base NUM
公鑰加密:
加密解密:
算法:RSA,ELGamal
工具:openssl rsautl, gpg
數字簽名:
算法:RSA, DSA, ELGamal
工具:
密鑰交換:
算法:DH
生成私鑰:
~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
提出公鑰:
~]# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
創建私有CA:
openssl命令:
配置文件:/etc/pki/tls/openssl.cnf
構建私有CA:
在肯定配置爲CA的服務上生成一個自簽證書,併爲CA提供所須要的目錄及文件便可;
步驟:
(1) 生成私鑰;
~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
(2) 生成自簽證書;
~]# 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:證書的有效時長,單位是day;
(3) 爲CA提供所需的目錄及文件;
~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
~]# touch /etc/pki/CA/{serial,index.txt}
~]# echo 01 > /etc/pki/CA/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
(3) 將請求經過可靠方式發送給CA主機;
(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
吊銷證書:
步驟:
(1) 客戶端獲取要吊銷的證書的serial(在使用證書的主機執行):
~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
(2) CA主機吊銷證書
先根據客戶提交的serial和subject信息,對比其與本機數據庫index.txt中存儲的是否一致;
吊銷:
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
其中的SERIAL要換成證書真正的序列號;
(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