1、加密和解密相關知識簡介算法
一、信息安全標準shell
NIST(National Institute of Standards and Technology)美國國家標準與技術研究院,制定了網絡信息安全與保密的三個要素:安全
保密性(confidentiality):信息不泄露給非受權用戶、實體或過程,或供其利用的特性。(通常包括數據保密性、隱私性。)服務器
完整性(Integrity):數據未經受權不能進行改變的特性。即信息在存儲或傳輸過程當中保持不被修改、不被破壞和丟失的特性。(通常包括數據完整性、系統完整性。)網絡
可用性(Availability):可被受權實體訪問並按需求使用的特性。即當須要時可否存取所需的信息。例如網絡環境下拒絕服務、破壞網絡和有關係統的正常運行等都屬於對可用性的***;併發
(這三大要素被簡稱爲:CIA)框架
儘管三要素能保證網絡信息安全和保密,但從不少從事網絡安全的研究人員的反饋發現,除了CIA外,還有另外兩個標準也被常常提醒:tcp
真實性:一個實體是真實的,是可被驗證的。要確保數據發送方的確是它所聲稱的那我的。ide
可追溯性:一旦受到***,能追溯***發生的原處在什麼地方。加密
二、OSI組織定義的安全框架x.800
安全***:
被動***:竊聽、(常見報文捕獲、監聽流量)
主動***:假裝、重播、消息修改、拒絕服務
安全機制:
加密、數字簽名、訪問控制、數據完整性、認證交換、流量填充、路由控制、公證
安全服務:
認證 :同等實體認證
訪問控制
數據保密性:
鏈接保密性
無鏈接保密性
選擇域保密性
流量保密性
數據完整性 :不容許插入、刪除、修改、重播
不能否認性
三、加密方式和算法
(1)對稱加密:採用單鑰密碼系統的加密方法,同一個密鑰能夠同時用做信息的加密和解密。
對稱加密的算法:
DES : 數據加密標準(56位密鑰)
3DES
AES :高級加密標準(128,192,256,384,512)
Blowfish
Twofish
IDEA
RC6
CAST5
對稱加密的特性:
a)加密、解密使用同一口令;
b)將明文分隔成固定大小的塊,逐個進行加密
對稱加密的缺陷:
a)密鑰過多;
b)密鑰傳輸;
密鑰交換、身份驗正、數據完整性
(2)公鑰加密:由對應的一對惟一性密鑰(即公開密鑰和私有密鑰)組成的加密方法。
(公鑰是從私鑰中提取出來的。)
(公鑰加密,只能私鑰解密。私鑰加密,也只能公鑰解密。)
密鑰:public key, secret key (p/s)
經常使用加密算法:
RSA, DSA, EIGamal
(DSA:只能用於身份驗證)
(3)單向加密:不可逆的加密
單向加密特性:
定長輸出: 不管原始數據是多大,結果大小都相同的
雪崩效應: 輸入的微小改變,將會引發結果的巨大改變
單向加密算法:MD5(128位)、SHA一、SHA25六、SHA38四、SHA512
2、加密和解密的過程和原理
首先問一個問題:假設B與A通訊,B向A發送報文,怎麼才能保證B的報文安全、可靠地被A接收到,而且保證報文數據的完整性?
接下來圍繞着這個問題來講明一下。
加密和解密的過程和原理以下圖:
加密解密過程和原理詳細說明:
一、發送端B :
(1)爲保證安全,要對報文加密。加密方法有三類:對稱加密、公鑰加密和單向加密。對稱加密不安全,單向加密是不可逆的,於是使用公鑰加密。
問題:公鑰加密安全(通常爲2048位),可是加密過程太慢了,不適用當前網絡需求,該怎麼辦?
(2)爲了解決上述問題,B能夠用單向加密提取出報文的特徵碼(特徵碼能保證報文的數據完整性),再使用自身的私鑰對特徵碼進行公鑰加密(特徵碼數據小,對其進行公鑰加密速度快),並把加密後的特徵碼附加到報文後。(使用私鑰加密是爲了驗證身份)
問題:這種方式能實現數據完整性和身份驗證的檢驗,可是卻缺失了報文的數據保密性,又該怎麼辦?
(3)爲了解決上述問題,B在把加密的特徵碼附加到報文後,把特徵碼和報文當作一個數據(假設爲data),使用對稱加密算法對該數據(data)加密得出一個密碼,再把密碼附加到該數據(data)後。爲了使得在傳輸過程當中密碼不被其餘人獲取或篡改,使用A的公鑰對密碼進行加密(只有A的私鑰能對其解密),把加密的密碼附加到數據data後,再這些數據一併發送給A。
二、接收端A:
(1)A接收到B傳來的報文,利用自身的私鑰對其解密,得到密碼。由於只有A的私鑰能對B傳來的報文(使用A的公鑰加密密碼)解密,因此能防止其餘人對該傳輸的報文進行解密而得到其中的信息,保證了數據的保密性。
(2)A利用得到的密碼解密其中對稱加密的數據,得到通過加密的特徵碼和原報文。
(3)A使用B的公鑰對該特徵碼解密,能解密則說明該報文是B發送過來的,實現了身份驗證。(假設解密後的特徵碼是fcode)
(4)A使用同等單向加密算法對接收到的原報文提取其特徵碼。使用該特徵碼和解密後得到的特徵碼(fcode)作比較,若是同樣,則說明原報文的數據完整。
問題:以上這種方式能保證數據完整性、身份驗證和數據的保密性,在加密和解密的過程當中都要用到對方的公鑰,如何在傳輸過程當中安全可靠地得到對方的公鑰就成了關鍵的一環,那該如何作呢?
答:安全可靠地獲取對方的公鑰靠CA(Certificate Authority )證書受權中心來實現。
於是接下來,咱們來講說CA。
3、CA(證書受權中心)
一、CA證書標準:x.509
x.509: 定義了證書結構和認證協議標準;(基於公鑰和數字簽名)
用於:IP安全、TLS/SSL(傳輸層安全)和S/MIME(安全電子郵件通訊)
x.509證書標準詳細說明:
(1)版本號(默認爲1,若是有多個擴展,可能爲3)
(2)證書序列號(是一個整數,在CA中惟一標識,代表發行了多少個證書)
(3)算法參數 (標誌用了那種算法)
(4)發行者的名稱(CA本身的名字)
(5)有效期限
(6)主體名稱(證書擁有者名稱)(很關鍵!!!)(我的用戶使用的是我的用戶名,主機使用的必須是主機名而不是ip地址)
(7)公鑰(最重要)(公鑰由證書擁有者提供)
(8)發行者的ID(CA的惟一編號)
(9)主體的ID(CA生成的證書擁有者惟一編號)
(10)擴展
(11)CA的簽名(用於驗證CA的來源合法性)
CA是相對於發送方B和接收方A的第三方,是具備公信力的機構。
二、驗證數字證書的過程
B在發送以前得到A的數字證書或A在接收以前得到B的數字證書,都會去驗證該數字證書的真僞。
以B在發送以前得到A的數字證書爲例,說明驗證數字證書的過程:
(1)要用對應給A發數字證書的那個CA的公鑰去解密CA的簽名,若是能解密,則說明A的數字證書確實是那個信任的CA所頒發的證書。
(2)解密出一段特徵碼,B再使用一樣的單向加密算法提取A的數字證書的特徵碼,比較這兩個特徵碼是否同樣,若是同樣,則表示得到的A的數字證書是完整的。
(3)此後,還要去驗證該數字證書中的持有者是否是A,若是驗證經過,才能夠肯定該數字證書確實是A的數字證書。
(4)確認該數字證書的擁有者是A後,還要去查看該數字證書是否在有效期限內和是否在CA的數字證書吊銷列表中。
4、SSL層
一、SSL層
SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是爲網絡通訊提供安全及數據完整性的一種安全協議。
版本:sslv1, sslv2, sslv3
(ssl是介於網絡層和傳輸層之間的半層,通常被製做成公共共享庫,要想使用ssl就要調用ssl共享庫。)
二、https通訊過程
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL。
以https爲例,進一步說明如何依靠CA來可靠的得到通訊對方的公鑰
https的主要實現過程說明:
(1)在通訊以前,服務器端經過加密算法生成一對密鑰,並把其公鑰發給CA申請數字證書,CA審覈後,結合服務端發來的相關信息生成數字證書,並把該數字證書發回給服務器端。
(2)客戶端和服務器端經tcp三次握手,創建初步鏈接。
(3)客戶端發送http報文請求並協商使用哪一種加密算法。
(4)服務端響應報文並把自身的數字簽名發給服務端。
(5)客服端下載CA的公鑰,驗證其數字證書的擁有者是不是服務器端(這個過程能夠獲得服務器端的公鑰)。(通常是客戶端驗證服務端的身份,服務端不用驗證客戶端的身份。)
(6)若是驗證經過,客戶端生成一個隨機對稱密鑰,用該密鑰加密要發送的URL連接申請,再用服務器端的公鑰加密該密鑰,把加密的密鑰和加密的URL連接一塊兒發送到服務器。
(7)服務器端使用自身的私鑰解密,得到一個對稱密鑰,再用該對稱密鑰解密經加密的URL連接,得到URL連接申請。
(8)服務器端根據得到的URL連接取得該連接的網頁,並用客戶端發來的對稱密鑰把該網頁加密後發給客戶端。
(9)客戶端收到加密的網頁,用自身的對稱密鑰解密,就能得到網頁的內容了。
(10)TCP四次揮手,通訊結束。
5、openssl自建CA過程詳解
OpenSSL是套開放源代碼的軟件庫包,實現了SSL與TLS協議。其主要庫是以C語言所寫成,實現了基本的加密功能。
OpenSSL能夠運行在絕大多數類Unix操做系統上(包括Solaris,Linux,Mac OS X與各類版本的開放源代碼BSD操做系統),OpenVMS與Microsoft Windows。它也提供了一個移植版本,能夠在IBM i(OS/400)上運做。
此軟件是以Eric Young以及Tim Hudson兩人所寫的SSLeay爲基礎所發展的,SSLeay隨着兩人前往RSA公司任職而中止開發。
雖然此軟件是開放源代碼的,但其受權書條款與GPL有衝突之處,故GPL軟件使用OpenSSL時(如Wget)必須對OpenSSL給予例外。
openssl創建私有CA的詳細過程以下:
openssl建立私有CA的過程:
前提:
安裝openssl :# yum install openssl
一、創建CA服務器:
(1)生成密鑰
# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
命令解釋:
()表示將會在當前shell中新建一個子shell,將()中的命令放到該子shell中執行,執行完畢後關閉子shell並回到當前shell。
因爲要對生成的cakey.pem文件設置合適權限,可以使用umask修改文件的默認權限設置。爲了避免影響當前shell的默認權限設置,使用()將這些命令放到子shell中執行就好了!
genrsa : 指定使用rsa算法生成私鑰
-out :指定生成的私鑰的存放位置(注意:該存放位置是在配置文件中默認定義了的,路徑和文件名不能隨意修改!!!)
2048 :指定生成一個2048位的私鑰
(2)自簽證書
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
命令解釋:
req: 生成證書籤署請求
-news: 新請求
-key /path/to/keyfile: 指定私鑰文件(req命令能根據私鑰自動抽取出公鑰)
-out /path/to/somefile: (注意:路徑和文件名不用隨意修改!)
-x509: 專門用於生成自簽署證書
-days n: 有效天數(通常和-x509一塊兒使用纔有意義。)
(3)初始化工做環境(只有第一次建立CA時,才須要初始化工做環境)
# touch /etc/pki/CA/{index.txt,serial}
# echo 01 > /etc/pki/CA/serial (指定序列號從那個數字開始)
二、節點申請證書:
(1) 節點生成請求
a、生成密鑰對兒
# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
b、生成證書籤署請求
# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr
-csr :證書籤署請求,通常都是這樣的後綴
c、把簽署請求文件發送給CA服務
(2) CA簽署證書
a、驗正證書中的信息;
b、簽署證書
# openssl ca -in /path/to/somefile.csr -out /path/to/somefile.crt -days N
[root@localhost CA]# openssl ca -in /etc/httpd/ssl/httpd.csr -out /etc/httpd/ssl/httpd.crt -days 1000
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Jul 3 14:07:23 2014 GMT
Not After : Mar 29 14:07:23 2017 GMT
Subject:
countryName = CN #國家名
stateOrProvinceName = GuangDong #省份名
organizationName = 51CTOblog #公司名
organizationalUnitName = Ops #部門名
commonName = www.hjqjk.com #主機名
emailAddress = hjqjk@163.com #郵箱
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
F9:DB:00:04:8A:D7:17:C8:21:B7:2D:15:F2:E9:89:66:BB:6D:D5:F9
X509v3 Authority Key Identifier:
keyid:98:56:B3:30:B0:9D:75:A1:69:AD:BF:2F:E4:0D:FE:3F:17:87:B0:A8
Certificate is to be certified until Mar 29 14:07:23 2017 GMT (1000 days)
Sign the certificate? [y/n]:y #詢問是否簽署證書
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@localhost CA]# ls /etc/httpd/ssl #證書已簽署,自建CA到這裏就成功了
httpd.crt httpd.csr httpd.keyc、發送給請求者;
以後,只要把簽署的證書發回給申請者就好了!