數據加密解密及Linux OpenSSL詳解

一、加密方式

對稱加密:

採用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱爲對稱加密,也稱爲單密鑰加密

需要對加密和解密使用相同密鑰加密算法。由於其速度快,對稱性加密通常在消息發送方需要加密大量數據時使用。對稱性加密也稱爲密鑰加密

所謂對稱,就是採用這種加密方法的雙方使用方式用同樣的密鑰進行加密和解密。密鑰是控制加密及解密過程的指令。算法是一組規則,規定如何進行加密和解密。因此安全性不僅取決於加密算法本身,密鑰管理的安全性更是重要。因爲加密和解密都使用同一個密鑰,如何把密鑰安全地傳遞到解密者手上就成了必須要解決的問題。常用的對稱加密有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等

對稱加密固然能夠保證數據的機密性,但無法保證數據的完整性和可用性。如下圖所示:


221319923.png

非對稱加密:

與對稱加密算法不同,非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。因爲加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法

特點:

私鑰加密的數據-->與之配對的公鑰解密 實現身份驗證

公鑰加密的數據-->與之配對的私鑰解密 實現數據的機密性

加密的數據是對稱加密的三個數量級,所以非對稱加密算法很少對數據進行加密,大部分用於密碼加密。

功能:

身份驗證

機密性

密鑰交換

非對稱加密本身並不難理解,結合圖對非對稱加密的流程做簡要的分析。

164426237.png

如圖所示,對數據進行加密之前要準備好兩個密鑰,一個公鑰,一個私鑰;其中公鑰是公開的,任何人都可以獲得,私鑰只有解密方擁有。會話雙方分別爲老李和小王,老李現在想給小王傳送數據,爲了避免被監聽,老李需要對數據進行加密。由於數據的接受方是小李,所以老王選擇使用小李的公鑰進行加密,小李的公鑰任何人都可以知道,不需要祕密傳送。小李在接收了老王傳送的數據之後,使用只有他自己知道的私鑰進行解密。從整個過程看,不涉及密鑰的傳輸,所以從根本上解決了對稱加密的密鑰傳輸安全問題。

單向加密:

它的特點:不管加密的數據多長都會定長輸出;不可逆轉即無法將得到的數據在逆着解密;雪崩效應即數據微小的變化就會導致結果的巨大變化

常用在此機制上的算法有:MD5、 SHA1 、CRC-32


實現身份驗證和數據完整性但無法保證數據安全的過程:


A先用單向加密數據將得到的數據再用自己的私鑰加密附在數據之後發給B;B收到數據後若能用A的公鑰解密出加過密的特徵碼則說明這就是A發來的數據,若用單向加密數據能得到和A發來的一模一樣的特徵碼說明此數據沒被別人篡改過這樣就保證了數據的完整性

實現身份驗證,數據完整性和數據加密的過程:


A用單向加密要發給B的數據得到特徵碼,再用自己的私鑰加密此特徵碼,將加過密的特徵碼附加在數據之後A會用自己生成的對稱密鑰加密這兩段數據再用A的公鑰加密生成的密鑰再次附件在加過密的兩段數據之後發給B;B收到數據後用自己的私鑰解密出密碼然後用此密碼解密出數據,若B能用A的公鑰解出附加在數據之後的特徵碼就說明這就是A發來的數據,若B用單向加密得到的數據特徵碼和A發來的一模一樣則說明此數據未被篡改過如此一來身份驗證,數據完整性和數據加密便都可實現了但此過程也會遇到無法保證得到的公鑰就是要通信的一方的公鑰。


理想完整的安全發送流程:

加密:

1、發送方使用選定的單向加密算法計算原始數據的特徵碼;

2、發送方使用自己的私鑰加密特徵碼,附加於原始數據後面;

3、發送方生成一次性對稱密鑰,並使用此密鑰加密數據(原始數據+加密後的特徵碼)

4、發送方使用接收方的公鑰加密一次性對稱密鑰;附加於加密數據後面

解密:

1、接收方使用自己的私鑰解密加密的一次性對稱密鑰;

2、使用對稱密鑰解密數據,得到加密的特徵碼和原始數據;

3、使用發送方公鑰解密加密的特徵碼;

4、使用與發送方相同的單向加密算法重新計算數據的特徵碼,並與解密出的特徵作比較;

圖解:

182321741.jpg

二、數字證書(公鑰證書):

數字證書:x.509v3

版本號(version)

序列號():證書本身在CA中惟一標識;

簽名算法標誌

發行者名稱

有效期:

證書主體名稱:(組織(主機),個人)

證書主體公鑰信息:

發行商惟一標誌

證書主體的惟一標誌

擴展:

簽名:


PKI: Public Key Infrastructure

端實體(申請者)

註冊機構(RC)

簽證機構(CA)-->簽證機構(CA)

證書撤消列表(CRL)發佈機構

證書存取庫

服務器證書(SSL證書)

服務器證書被安裝於服務器設備上,用來證明服務器的身份和進行通信加密。服務器證書可以用來防止欺詐釣魚站點。

數字證書頒發過程圖示

數字證書頒發過程圖示

在服務器上安裝服務器證書後,客戶端瀏覽器可以與服務器證書建立SSL連接,在SSL連接上傳輸的任何數據都會被加密。同時,瀏覽器會自動驗證服務器證書是否有效,驗證所訪問的站點是否是假冒站點,服務器證書保護的站點多被用來進行密碼登錄、訂單處理、網上銀行交易等。全球知名的服務器證書品牌有Globlesign,Verisign,Thawte,Geotrust等。

SSL證書主要用於服務器(應用)的數據傳輸鏈路加密和身份認證,綁定網站域名,不同的產品對於不同價值的數據和要求不同的身份認證。

最新的高端SSL證書產品是擴展驗證(EV)SSL證書。在IE7.0、FireFox3.0、Opera 9.5等新一代高安全瀏覽器下,使用擴展驗證VeriSign(EV)SSL證書的網站的瀏覽器地址欄會自動呈現綠色,從而清晰地告訴用戶正在訪問的網站是經過嚴格認證的。

HTTPS圖解:

111632346.png

1. 客戶端發起HTTPS請求

這個沒什麼好說的,就是用戶在瀏覽器裏輸入一個https網址,然後連接到server的443端口。


2. 服務端的配置

採用HTTPS協議的服務器必須要有一套數字證書,可以自己製作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過,纔可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面(startssl就是個不錯的選擇,有1年的免費服務)。這套證書其實就是一對公鑰和私鑰。如果對公鑰和私鑰不太理解,可以想象成一把鑰匙和一個鎖頭,只是全世界只有你一個人有這把鑰匙,你可以把鎖頭給別人,別人可以用這個鎖把重要的東西鎖起來,然後發給你,因爲只有你一個人有這把鑰匙,所以只有你才能看到被這把鎖鎖起來的東西。


3. 傳送證書

這個證書其實就是公鑰,只是包含了很多信息,如證書的頒發機構,過期時間等等。


4. 客戶端解析證書

這部分工作是有客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那麼就生成一個隨機值。然後用證書對該隨機值進行加密。就好像上面說的,把隨機值用鎖頭鎖起來,這樣除非有鑰匙,不然看不到被鎖住的內容。


5. 傳送加密信息

  這部分傳送的是用證書加密後的隨機值,目的就是讓服務端得到這個隨機值,以後客戶端和服務端的通信就可以通過這個隨機值來進行加密解密了。


6. 服務段解密信息

 服務端用私鑰解密後,得到了客戶端傳過來的隨機值(私鑰),然後把內容通過該值進行對稱加密。所謂對稱加密就是,將信息和私鑰通過某種算法混合在一起,這樣除非知道私鑰,不然無法獲取內容,而正好客戶端和服務端都知道這個私鑰,所以只要加密算法夠彪悍,私鑰夠複雜,數據就夠安全。


7. 傳輸加密後的信息

這部分信息是服務段用私鑰加密後的信息,可以在客戶端被還原。


8. 客戶端解密信息

  客戶端用之前生成的私鑰解密服務段傳過來的信息,於是獲取瞭解密後的內容。整個過程第三方即使監聽到了數據,也束手無策。


三、OpenSSL詳解:

組成部分:

  • libcrpto:通用加密庫

  • libssl:TLS/SSl的實現,基於會話的,實現了身份認證、、數據機密性和會話完整性的TLS/SSL庫

  • openssl:多用途命令行工具,可以實現私有證書頒發機構

加密和解密一個文件,實例:

openssl enc -des3 -in functions -e -out functions.des3
#通過enc指定des3加密方式對functions文件進行加密,保存在funtions.des3中
openssl enc -des3  -in functions.des3 -d -out function.txt
#通過enc指定以desc加密方式的functions.des3文件進行解密,保存在function.txt中


通過dges參數對文件進行單向加密,實例:

openssl dgst -sha1 function:計算數據的特徵碼

其他方式加密,實例:

openssl passwd –l 密碼 :輸入密碼即可顯示加密後的密碼
openssl passwd -1 -salt 數據:加密的時候指定salt
openssl rand -base64 8:生成隨機數

獲取公鑰:

#openssl rsa -in /path/to/keyfile -pubout

申請證書流程:

1、生成一個私鑰:

#(umask 077;openssl genrsa -out /root/mykey.pri 2048)

2、製作一個證書籤署請求:

openssl req -new -key /root/mykey.pri -out /root/myreq.csr

#/root/mykey.pri(私鑰文件),-out保存在/root/myreq.csr

3、由CA負責簽署證書

1、 配置/etc/pki/tls/openssl.cnf文件

####################################################################
[ CA_default ]
dir = /etc/pki/CA # Where everything is kept (CA中心的目錄)
certs = $dir/certs # Where the issued certs are kept (證書保存目錄)
crl_dir = $dir/crl # Where the issued crl are kept (被吊銷證書的目錄)
database = $dir/index.txt # database index file. (證書索引文件)
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.(經過CA中心簽名的證書備份目錄)
certificate = $dir/my-ca.crt # The CA certificate (CA的公鑰文件名)
serial = $dir/serial # The current serial number (CA中心的頒發證書序列號)
crlnumber = $dir/crlnumber # the current crl number (已吊銷證書序列號)
# must be commented out to leave a V1 CRL
crl = $dir/my-ca.crl # The current CRL (證書吊銷列表)
private_key = $dir/private/my-ca.key # The private key (CA私鑰文件)
RANDFILE = $dir/private/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
default_days = 365 # how long to certify for (證書有效期)
default_crl_days= 30 # how long before next CRL
default_md = default # use public key default MD
preserve = no # keep passed DN ordering
[ policy_match ] #此段爲證書相關信息選項,其中match指定的項,要求被簽名證書一定要與CA的對應項一致。
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
#
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN (國家代碼需要自己修改)
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Hebei (州或省名需要自己修改)
localityName = Locality Name (eg, city)
localityName_default = Beijing (地點名稱需要自己修改)
0.organizationName = Organization Name (eg, company)
0.organizationName_default = Tianli Company (組織或公司名需要自己修改)

2、生成自簽證書:

[root@TP-CW-WS-DL-02~]# cd /etc/pki/CA
[root@TP-CW-WS-DL-02 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
................................+++
.....................................+++
e is 65537 (0x10001)
#openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
#自建CA必須與之前的保持一致。
touch index.txt
echo 01>serial
3、簽署證書:
#openssl ca -in /path/to/myreq.csr -out /path/to/certfile.crt -days 365

簽署後的index.txt文件如下

[root@TP-CW-WS-DL-02 CA]# cat index.txt
V       231117165318Z           00      unknown /C=CN/ST=Shanghai/O=bjiaonline/OU=Tech/CN=www.bjiaonline.com/[email protected]



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章